Wie funktioniert Foldable.foldl bei Num a = a?

8

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 ?

    
Lifu Huang 14.09.2017, 16:00
quelle

1 Antwort

9

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 :

aufzurufen %Vor%

foldl dreht im Grunde nur die Argumente um, um den gleichen Trick zu machen:

%Vor%

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.

    
Mark Seemann 14.09.2017, 16:16
quelle