Das Naturgesetz besagt:
t . traverse f == traverse (t . f) -- for every applicative transformer t
Wenn nun für die RHS des Gesetzes f den Typ hat Applicative a => x -> a y
, muss t (Applicative a, Applicative b) => a y -> b y
aufgrund der Funktionszusammensetzung vom Typ sein .
Für die LHS hat die Traverse f den Typ (Applicative a, Traversable c) => c x -> a (c y)
. Da aber die Traverse f mit t zusammengesetzt ist. Traverse f, t muss vom Typ (cx -> a (cy)) -> b y sein.
Nun hat t für die LHS den Typ a (cy) -> by, aber von der RHS hat es den Typ ay -> b y. Wie klingt das Gesetz aus einer Typperspektive?
Bearbeiten: Der Typ t in LHS wurde korrigiert
haskell
types
applicative
traversable
user4132
quelle
quelle
Antworten:
Ich denke, was Sie verpasst haben, ist, dass
t
es sich um eine natürliche Transformation handeln soll (die wahrscheinlich auch einige strukturerhaltende Eigenschaften haben muss). Natürliche Transformationen werden wie folgt quantifiziert:Rechts instanziieren wir es
y
, um zu bekomment :: a y -> b y
; links instanziieren wir es umc y
zu bekommena (c y) -> b (c y)
. Ich denke, dass eine natürliche Transformation die äußere Schicht verändert, egal was sich darin befindet. Naturgesetze sprechen immer über Beziehungen zwischen den verschiedenen Arten, wie etwas instanziiert wird.quelle