Zunächst haben wir die schöne Definition
x = 1 : map (2*) x
Das ist an sich schon ein bisschen umwerfend, wenn Sie es noch nie gesehen haben. Auf jeden Fall ist es ein ziemlich normaler Trick der Faulheit und Rekursion. Jetzt werden wir die explizite Rekursion mit fix
und point-free-ify los.
x = fix (\vs -> 1 : map (2*) vs)
x = fix ((1:) . map (2*))
Das nächste, was wir tun werden, ist den :
Abschnitt zu erweitern und das map
unnötig komplex zu machen.
x = fix ((:) 1 . (map . (*) . (*2)) 1)
Nun haben wir zwei Kopien dieser Konstante 1
. Das wird niemals funktionieren, also werden wir den Reader-Applikativ verwenden, um das zu duplizieren. Außerdem ist die Funktionszusammensetzung ein bisschen Unsinn. Ersetzen (<$>)
wir sie also durch wo immer wir können.
x = fix (liftA2 (.) (:) (map . (*) . (*2)) 1)
x = fix (((.) <$> (:) <*> (map . (*) . (*2))) 1)
x = fix (((<$>) <$> (:) <*> (map <$> (*) <$> (*2))) 1)
Als nächstes: Dieser Aufruf von map
ist viel zu lesbar. Aber es gibt nichts zu befürchten: Wir können die Monadengesetze verwenden, um sie ein wenig zu erweitern. Insbesondere fmap f x = x >>= return . f
also
map f x = x >>= return . f
map f x = ((:[]) <$> f) =<< x
Wir können punktfrei ify, ersetzen (.)
mit (<$>)
, und fügen Sie dann einige falsche Abschnitte:
map = (=<<) . ((:[]) <$>)
map = (=<<) <$> ((:[]) <$>)
map = (<$> ((:[]) <$>)) (=<<)
Ersetzen Sie diese Gleichung in unserem vorherigen Schritt:
x = fix (((<$>) <$> (:) <*> ((<$> ((:[]) <$>)) (=<<) <$> (*) <$> (*2))) 1)
Schließlich brechen Sie Ihre Leertaste und erstellen die wunderbare endgültige Gleichung
x=fix(((<$>)<$>(:)<*>((<$>((:[])<$>))(=<<)<$>(*)<$>(*2)))1)