In LYAH gibt es einen Code, der so aussieht.
> %Vor% Soweit ich weiß, ist foldMap
vom Typ foldMap :: (Monoid m, Foldable t) => (a -> m) -> t a -> m
, aber Num a => a
selbst ist nicht vom Typ Monoid
, also frage ich mich, wie funktioniert Foldable.foldl
tatsächlich hier? Und da foldMap
intern von Foldable.foldl
aufgerufen wird, was ist der Typ von Monoid
?
Es ist ein bisschen einfacher herauszufinden, ob Sie foldr
mit dem Typ (a -> b -> b) -> b -> t a -> b
berücksichtigen. Die Funktion 'algebra' hat den Typ a -> b -> b
, den Sie als a -> (b -> b)
anzeigen können - also eine Funktion, die a
als Eingabe akzeptiert und b -> b
als Ausgabe zurückgibt.
Nun ist b -> b
ein Endomorphismus , der auch ein Monoid ist, und Data.Monoid
definiert einen Typ Endo a
(oder hier sollte es vielleicht Endo b
sein), was ist tatsächlich ein Monoid
.
foldr
verwendet intern Endo
, um foldMap
:
foldl
dreht im Grunde nur die Argumente um, um den gleichen Trick zu machen:
Um es klar zu sagen, ich habe diese zwei Funktionsimplementierungen buchstäblich aus der Haskell-Quelle kopiert. Wenn Sie die Dokumentation von Data.Foldable aufrufen, gibt es verschiedene Möglichkeiten Links, um die Quelle anzuzeigen. Das habe ich gemacht.
Tags und Links haskell functional-programming