Ir para o conteúdo

Séries Geométricas

Em Matemática, uma série geométrica é uma série com um rácio constante entre os sucessivos termos. Visto Haskell ser lazy, uma pessoa consegue facilmente gerar a lista infinita das sequências. Ficam alguns exemplos.

Exemplos

Todas as versões irão definir a função serie que receberá dois argumentos, um para indicar o valor do primeiro termo e o seguinte para indicar o rácio.

-- Usando listas por compreensão
serie t r = [ t * r^x | x <- [0..]]

-- Usando Monad de listas
serie t r = [0..] >>= return . (t*) . (r^)

-- Usando a sintaxe 'do'
serie t r = do
   x <- [0..]
   return (t * r^x)

-- Usando o tradicional map
serie t r = map ((t*).(r^)) [0..]

-- Usando a definição da própria função
serie t r = t : map (*r) (serie t r)

-- A função 'iterate' até parece que foi criada de propósito para este problema
serie t r = iterate (*r) t

-- Usando um fold especial que armazena os passos intermédios
-- Irá gerar uma sequência infinita já que o fold nunca irá calcular o último termo...
serie t r = scanl (*) t (repeat r)

-- Usando o Y Combinator (em Haskell 'fix')
-- Necessário importar a biblioteca (Control.Monad.Fix)
-- Ou então definir à mão
fix f = f (fix f)

serie t r = fix ((t:) . map (*r))

-- Usando anamorfismo sobre listas
-- Define-se primeiro as funções para anamorfismo em listas
-- Usando notações de Arrows (import Control.Arrow)

inList = (const [] ||| (uncurry (:)))
recList f = id +++ ( id *** f)
ana f = inList . (recList (ana f)). f

-- Tendo a função generalista para anamorfismo de listas criada
-- Usamos para o nosso caso particular
serie t r = ana (Right . (id &&& (*r))) t


-- No caso das listas, Haskell já vem com a função de cata/anamorfismo no sistema de bibliotecas
-- Para catamorfismos temos as funções foldr, etc
-- Para anamorfismos temos a função unfoldr (import Data.List)
serie t r = unfoldr (Just . (id &&& (*r))) t