Ich wollte nur mit einer Anekdote anfangen, weil ich gerade Haskell lerne, während wir sprechen. Ich lerne Haskell, weil mir die Idee gefällt, Funktionen von Aktionen zu trennen, und es gibt einige wirklich sexy Theorien hinter der impliziten Parallelisierung, weil reine Funktionen von nicht reinen Funktionen isoliert werden.
Ich lerne jetzt seit drei Tagen die Fold-Funktionsklasse. Fold scheint eine sehr einfache Anwendung zu haben: eine Liste zu nehmen und sie auf einen einzigen Wert zu reduzieren. Haskell implementiert a foldl
und foldr
dafür. Die beiden Funktionen haben sehr unterschiedliche Implementierungen. Es gibt eine alternative Implementierung von foldl
, genannt foldl'
. Darüber hinaus gibt es eine Version mit einer etwas anderen Syntax foldr1
und foldl1
unterschiedlichen Anfangswerten. Davon gibt es eine entsprechende Implementierung von foldl1'
for foldl1
. Als ob all dies nicht umwerfend wäre, funktionieren die Funktionenfold[lr].*
erfordern als Argumente und verwenden intern in der Reduktion haben zwei separate Signaturen, nur eine Variante arbeitet auf unendlichen Listen (r), und nur eine von ihnen wird im konstanten Speicher ausgeführt (wie ich verstehe (L), weil nur es erfordert a redex
). foldr
Um zu verstehen, warum mit unendlichen Listen gearbeitet werden kann, ist zumindest ein gutes Verständnis der Sprachen Lazy-Behavoir und des kleinen Details erforderlich, dass nicht alle Funktionen die Bewertung des zweiten Arguments erzwingen. Die Online-Grafiken für diese Funktionen sind für jemanden, der sie im College noch nie gesehen hat, verdammt verwirrend. Es gibt keinperldoc
Äquivalent. Ich kann keine einzige Beschreibung finden, was eine der Funktionen im Haskell-Vorspiel bewirkt. Das Vorspiel ist eine Art vorinstallierte Distribution, die mit dem Kern geliefert wird. Meine beste Ressource ist wirklich ein Typ, den ich noch nie getroffen habe (Cale), der mir mit enormen Kosten für seine eigene Zeit hilft.
Oh, und Fold muss die Liste nicht auf einen Skalar ohne Listentyp reduzieren. Die Identitätsfunktion für Listen kann geschrieben werden foldr (:) [] [1,2,3,4]
(Hervorhebungen, die Sie in einer Liste sammeln können).
Ich gehe zurück zum Lesen.