2015-03-18 5 views

Antwort

13

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.

+0

"Parametrisierung über' c "erlaubt, dass alle diese Zwischentypen unterschiedlich sind" - könnten Sie das näher erläutern? Das macht keinen offensichtlichen Sinn. – leftaroundabout

+0

@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