Pour commencer, nous avons la belle définition
x = 1 : map (2*) x
ce qui en soi est un peu l'esprit de flexion si vous ne l'avez jamais vu avant. De toute façon c'est un assez truc standard de la paresse et de la récursivité. Maintenant, nous allons nous débarrasser de l'explicite en utilisant la récursivité fix
, et le point-gratuit-identifier.
x = fix (\vs -> 1 : map (2*) vs)
x = fix ((1:) . map (2*))
La prochaine chose que nous allons faire est de développer l' :
section et de faire de l' map
inutilement complexe.
x = fix ((:) 1 . (map . (*) . (*2)) 1)
Eh bien, maintenant nous avons deux copies de cette constante, 1
. Que ne pourra jamais faire, nous allons utiliser le lecteur applicatif de le dupliquer. Aussi, en fonction de la composition est un peu de la foutaise, donc, nous allons la remplacer avec (<$>)
partout où nous le pouvons.
x = fix (liftA2 (.) (:) (map . (*) . (*2)) 1)
x = fix (((.) <$> (:) <*> (map . (*) . (*2))) 1)
x = fix (((<$>) <$> (:) <*> (map <$> (*) <$> (*2))) 1)
Prochaine étape: que l'appel à l' map
est beaucoup trop lisible. Mais il n'y a rien à craindre: nous pouvons utiliser la monade lois de l'élargir un peu. En particulier, fmap f x = x >>= return . f
, de sorte
map f x = x >>= return . f
map f x = ((:[]) <$> f) =<< x
Nous pouvons point-gratuit-identifier, remplacez - (.)
avec (<$>)
, puis ajouter quelques fausses sections:
map = (=<<) . ((:[]) <$>)
map = (=<<) <$> ((:[]) <$>)
map = (<$> ((:[]) <$>)) (=<<)
La substitution de cette équation dans notre étape précédente:
x = fix (((<$>) <$> (:) <*> ((<$> ((:[]) <$>)) (=<<) <$> (*) <$> (*2))) 1)
Enfin, vous vous cassez la barre d'espace et de produire le merveilleux équation finale
x=fix(((<$>)<$>(:)<*>((<$>((:[])<$>))(=<<)<$>(*)<$>(*2)))1)