Question

iterate :: (a -> a) -> a -> [a]

(Comme vous le savez sans doute) iterate est une fonction qui prend une valeur de fonction et de départ. Ensuite, il applique la fonction à la valeur de départ, il applique la même fonction au dernier résultat, et ainsi de suite.

Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude> 

Le résultat est une liste infinie. (Ce qui est la raison pour laquelle j'utilise take). Ma question comment voulez-vous mettre en œuvre votre propre fonction iterate' dans Haskell, en utilisant uniquement les bases (lambdas (:) de (++), modèle mataching, gardes, etc.)?

(Haskell débutant ici)

Était-ce utile?

La solution

Eh bien, iterate construit une liste infinie de valeurs a incrémenté par f . Je voudrais donc commencer par écrire une fonction qui préfixé une valeur a à la liste construite par récursive itérer appelant avec f a :

iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)

Merci à l'évaluation paresseuse, seule la partie de la liste construite nécessaire pour calculer la valeur de ma fonction sera évaluée.

Autres conseils

Notez également que vous pouvez trouver des définitions de concises pour la gamme des fonctions de base Haskell dans de rapport Prelude standard.

En lisant cette liste de définitions simples qui bootstrap essentiellement une riche bibliothèque de primitives premières peut être très instructif et ouvert les yeux en termes de fourniture d'une fenêtre sur le « chemin de haskell ».

Je me souviens très tôt aha moment de lecture. data Bool = False | True

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top