Die Idee ist, dass ein Wert eines algebraischen Datentypen in Haskell hat die Form
C x_1 x_2 ... x_n
wo C
ein Konstruktor ist und die x_i
sind die Argumente. Was
gfoldl app con
tut, ist so ein Wert in
con C `app` x_1 `app` x_2 ... `app` x_n
zu drehen, wodurch ein a
in eine c a
drehen. Lassen Sie uns die Art der C
nehmen
ist
C :: T_1 -> T_2 -> ... -> T_n -> D
dann einen Blick auf die Arten der Zwischen Ausdrücke aussehen lassen:
con C :: c (T_1 -> T_2 -> ... -> T_n -> D)
con C `app` x_1 :: c (T_2 -> ... -> T_n -> D)
con C `app` x_1 `app` x_2 :: c (... -> T_n -> D)
con C `app` x_1 `app` x_2 ... `app` x_n :: c D
Die Parametrierung über c
alle diese Zwischentypen erlaubt anders zu sein. Wenn wir stattdessen eine einfache Faltung verwenden würden, wie gfoldl'
, dann müssten alle diese Zwischentypen gleich sein.
Die Motivation für gfoldl
ist eine einzige Verallgemeinerung zu sein, die Sie drücken die SYB Funktionen gmapQ
und gmapT
(und einige andere) können. Die Arten von gmapQ
und gmapT
sind:
gmapQ :: Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapT :: Data a => (forall b. Data b => b -> b) -> a -> a
Während gmapQ
eine a
in eine einheitliche Liste der u
s kollabiert und konnte ausgedrückt werden unter Verwendung von gfoldl'
wäre dies nicht möglich sein, für gmapT
.
jedoch mit gfoldl
können wir c = Identity
nutzen, um uns zu ermöglichen etwas wie gmapT
zu bekommen, und c = Const
etwas wie gmapQ
zu bekommen.
Für weitere Informationen können Sie auch auf das Papier Scrap your boilerplate Reloaded aussehen sollen, die zeigt, dass gfoldl
ist eine gewöhnliche (noch höhere Ordnung) falten einen Datentyp, die Spine
in diesem Papier genannt wird. Die Verwendung der Identität und der konstanten Funktoren, um sowohl das transformierende als auch das Aktualisierungsverhalten von einer einzigen zugrundeliegenden Darstellung zu erhalten, hat Ähnlichkeiten mit der Art, wie man Linsenoperationen von "van Laarhoven" -Objektiven erhält.
"Parametrisierung über' c "erlaubt, dass alle diese Zwischentypen unterschiedlich sind" - könnten Sie das näher erläutern? Das macht keinen offensichtlichen Sinn. – leftaroundabout
@leftaroundabout In 'gfoldl' sind alle" c X "-Ereignisse" r ", d. H. Sie müssen alle vom selben Typ sein. Mit 'c X' kann ich immer noch alle denselben Typ haben, wie in' Const X', der isomorph zu 'r' ist. Aber ich kann auch alle unterschiedlich sein, wie z.B. in 'Identität X', die isomorph zu' X' ist. – kosmikus