Anwendbare Instanz für ein Tupel mit Monoid und Funktion innerhalb

9

Ich habe versucht, ein Haskell-Beispiel, zu dem ich früher gekommen bin, in scalaz umzuwandeln. Das ursprüngliche Beispiel war dies:

%Vor%

Was ich soweit verstehen kann, verwendet diese Instanz.

Es wird nicht wörtlich in scalaz konvertiert:

%Vor%

Obwohl ich nach einer Instanz gesucht habe und es scheint sei da (soweit ich das verstehen kann).

Die Frage ist also: Warum funktioniert das nicht so? Oder was habe ich vermisst / nicht richtig verstanden?

    
folone 07.06.2012, 18:01
quelle

1 Antwort

5

Scalaz's Äquivalent von Control.Applicative s <*> wird auch <*> genannt, obwohl es seine Argumente in umgekehrter Reihenfolge verwendet. So funktioniert das folgende:

%Vor%

Oder, wie ich als Antwort auf Ihren Kommentar bemerkt habe, könnten Sie Folgendes verwenden, wenn Sie bei |@| bleiben möchten:

%Vor%

Ich persönlich bevorzuge die <*> Version, auch wenn es sich rückwärts anfühlt.

Wir können etwas detaillierter durchgehen. Zuallererst brauchst du nicht die volle Leistung von Applicative hier - Apply reicht aus. Wir können die Apply Instanz für Tupel mit implicitly erhalten:

%Vor%

Jetzt können wir unser erstes Tupel auf das zweite anwenden:

%Vor%

Und das Ergebnis zum dritten:

%Vor%

Was wir wollen:

%Vor%

Die <*> -Methode für MA schließt das einfach etwas besser ein.

    
Travis Brown 07.06.2012, 19:44
quelle

Tags und Links