Ich bin herumalbern mit Linsen und Prismen und ich bin ein bisschen in die Unkräuter geraten. Ich mag folgende in Vorlage Haskell schreiben, aber wie ist es nicht kompiliert:Wie kann ich (Falte s a) von Control.Lens ein Monoid machen?
data Suit = Spade | Heart | Diamond | Club
makePrisms ''Suit
blackSuits = _Spade <> _Club
Alles, was ich weiß, über Linsen und Prismen (sowie Kommentare in der Getter
Dokumentation) legt nahe, dass _Spade <> _Club
eine gültiges Fold Suit()
sein sollte . Aber ghc kann den obigen Code nicht kompilieren; Es beschwert sich über mehrere mehrdeutige Instanzen. GHCI gibt mir die folgende Art Signatur für _Spade <> _Club
:
_Spade <> _Club
:: (Applicative f, Monoid (p Suit (f Suit)), Choice p) =>
p() (f()) -> p Suit (f Suit)
Und durch p
mit (->)
ersetzen kann ich diese Art zu
(Applicative f, Monoid (f Suit)) => (() -> f()) -> Suit -> f Suit
Der einzige Unterschied zwischen dem, entspannen und Fold Suit()
ist, dass letztere (Applicative f, Contravariant f) => ...
stattdessen hat der Monoid (f Suit)
Beschränkung. Wenn ich auf Contravariant
nachlese, sehe ich Aussagen, dass (Applicative f, Contravariant f)
zusammen implizieren, dass f
tatsächlich Const r
für einige Monoid r
ist. Dies scheint darauf hinzudeuten, dass der obige Typ tatsächlich eine Teilmenge von Fold Suit()
ist. Aber wenn ich versuche blackSuits :: Fold Suit()
meinen Code hinzufügen bekomme ich
Could not deduce (Monoid (f Suit)) arising from a use of ‘<>’
from the context (Contravariant f, Applicative f) ...
ich Ähnliche Fehler, wenn ich versuche, nur Monoide auf Falten zu definieren, anstatt mit Prismen zu starten. Nichts, was ich getan habe, um Fold s a
eine Monoid
zu machen und den Compiler zu bestehen. Gibt es eine Möglichkeit, dies zum Funktionieren zu bringen?
Ah, das ist, was "verdinglichte" Falten sind für! Vielen Dank! –