0votos

ciclos en Haskell

por josejuan hace 2 años

iterate ∘ (+)

realizar un ciclo que muestre la suma incrementada de un valor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- Buscamos una función que dado un incremento y valor inicial nos genera los valores incrementados (infinitos) 
suma :: Int -> Int -> [Int] 
 
-- O polimórfica como 
suma :: Num a => a -> a -> [a] 
 
-- Una forma directa por recursión podría ser 
suma incremento semilla = incrementa semilla 
   where incrementa x = x: incrementa (x + incremento) 
 
-- Aunque una forma más clara de verlo es con nombres más cortos y reduciendo la semilla 
suma i = inc where inc x = x: inc (x + i) 
 
-- Realmente y usando una definición "tipo correcursión" sería 
suma i x = x: suma i (x + i) 
 
-- La operación solicitada es un "anamorfismo", es decir, un generador de estructuras, por lo que 
-- podrá resolverse con `unfold`, `iterate`, ... (y con la función anterior, claro) por ejemplo 
suma i = unfoldr (\b -> let a = b + i in Just (a, a)) 
suma   = iterate . (+) 
 
-- La función y forma exacta dependerá del tipo de estructura que finalmente querremos generar 
-- por ejemplo `unfold` si es finita o correcursión o `iterate` si es infinita. 
suma acotada i = unfoldr (\b -> let a = b + i in if b < acotada then Just (a, a) else Nothing) 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.