Ich mag es nicht, Summen typisierte Werte mit Musterabgleich zu destrukturieren. Es fühlt sich für mich wegen seines spitzen Stils fremdartig an. Ich schreibe lieber und verwende switch
Funktionen für Summenarten.Punktfreie Destrukturierung mit GHC
Meine Frage ist jede Summe Typ im Allgemeinen, aber ich zeige es auf Either
als Beispiel:
data Processor cl cr r = MakeProcessor { l :: cl -> r, r :: cr -> r }
switch :: Processor cl cr r -> Either cl cr -> r
switch p ei =
case ei of
Left x -> l p x
Right x -> r p x
Mit dieser Erweiterung zu Either
:
statt dem:
map f e =
case e of
Left x -> Left x
Right x -> Right (f x)
Ich kann dies schreiben:
map f = switch (MakeProcessor { l : Left, r : f >>> Right })
, die ich für die meisten Situationen besser fühle.
Um solche Erweiterung Zeug schreiben [Processor
, switch
] für eine Summenart ist mechanische Arbeit. Also frage ich mich: Gibt es eine Möglichkeit, den Compiler [GHC] dazu zu bringen, es für mich zu tun? Oder eine andere Möglichkeit, die Summe typisierter Werte im sinnlosen Stil zu destrukturieren?
Hinweis: benutzte ich Either
als nur ein Beispiel. Either
war eine falsche Wahl, da viele Leser dachten, dass meine Frage speziell Either
war, und wies mich daher auf either
. Ich sollte eine Summe Typ, der nicht in der Basisbibliothek, wie
data Result a b = Fail a | Success b
Sie könnten die "Objektiv" -Bibliothek hilfreich finden. Es würde Ihnen erlauben, Ihre 'map'-Funktion als' over_Right' zu schreiben. –
Ich denke, dass _Right von TemplateHaskell stammt, oder? Vielleicht ist das zu streng, aber ich habe TH gemieden, weil es nicht mit SafeHaskell kompatibel ist. – libeako
Mein 'Entweder'-Beispiel ist nur ein Beispiel meiner Methode, um Mustervergleiche zu vermeiden. Es ist eine sicherere Version der 'entweder' Funktion in der Basisbibliothek. Meine Frage geht nicht speziell auf "Entweder", ich benutze es nur als Beispiel. – libeako