2009-11-23 13 views
2

Je sais que les suites infinies sont possibles dans Haskell - cependant, je ne suis pas tout à fait sûr de savoir comment générer unGénération d'une suite infinie dans Haskell

Étant donné une méthode

generate::Integer->Integer 

qui prennent un entier et produit l'entier suivant dans la séquence, comment pourrais-je construire une séquence infinie de cela?

Répondre

14

Si vous voulez que votre séquence pour démarrer à partir de 1 alors il est -

iterate generate 1 

S'il vous plaît notez que la première lettre de la fonction est en minuscule, pas en majuscules. Sinon, ce serait le type de données, pas la fonction. // edit: Je viens juste de réaliser que non seulement les types de données commencent par le capital, mais aussi le constructeur de données ou la classe de type, mais ce n'était pas le cas. :)

4

Il y a plusieurs façons de le faire, mais on est:

gen :: (a -> a) -> a -> [a] 
gen f s = s : gen f (f s) 

Cette fonction prend un functon f et certains valus s et retourne s, après wich il appelle lui-même avec ce même f, et le résultat de f s. Démonstration:

Prelude> :t succ 
succ :: (Enum a) => a -> a 
Prelude> let gen f s = s : gen f (f s) 
Prelude> take 10 $ gen succ 3 
[3,4,5,6,7,8,9,10,11,12] 

Dans l'exemple ci-dessus succ agit comme la fonction generate :: Integer -> Integer que vous mentionnez. Mais observer que gen fonctionnera avec n'importe quelle fonction de type a -> a.

Edit: et en effet, gen est identique à la fonction iterate du Prélude (et Data.List).

13

Ajout à la réponse de Matajon: un moyen de découvrir la fonction iterate autre que de demander ici serait d'utiliser Hoogle.

Hoogle's first answer for the query(a -> a) -> [a] est iterate.

+2

+1 pour diffuser la reconnaissance Hoogle. –

+0

+1 pour me présenter à Hoogle: D – Martin