Ich bin ein sehr neuer Haskell-Lerner. Ich habe einen funktionierenden Ausdruck:
%Vor% scheint perfekt zu funktionieren (Ich verwende das Parsec
-Paket, aber ich hoffe, dass diese Frage nichts mit ihrer Funktionalität zu tun hat, soweit ich weiß, <|>
ist ein Parsec-definierter Infix-Operator). parseA
und parseB
haben beide den% monad-Typ Parser Foo
, genau wie der gesamte Ausdruck.
Basierend auf dem, was ich bisher gelesen habe, scheint es so zu sein wie
%Vor%und
%Vor%aber keiner der letzteren kompiliert, sie klagen über nicht übereinstimmende Typen (Fehler unten).
Mein anderer Versuch, dies umzuschreiben, als
%Vor%scheint zu funktionieren. Aber wenn ich das auch falsch verstanden habe, sag es bitte.
Also meine Frage ist, kann jemand erklären, warum die ersten drei verschieden sind. Ich bin verwirrt, warum sie nicht gleichwertig sind. Was vermisse ich?
Fehler (falls das relevant ist, obwohl fwiw ich nicht versuche, meinen Code zu "reparieren" - ich habe eine funktionierende Version, ich versuche zu verstehen, wie sich die Versionen unterscheiden):
%Vor%gibt
%Vor%und
%Vor%gibt
%Vor%Die Regeln für die Entschlüsselung der Do-Notation implizieren das
%Vor%entspricht
%Vor%($)
gegen (>>=)
Da (=<<)
eine umgedrehte Version von (>>=)
ist, entsprechen beide
Dies bedeutet, dass der einzige Unterschied zwischen Ihrer korrekten Version und return $ try parseA <|> parse B
der Unterschied zwischen (=<<)
und ($)
ist, deren Typen sind:
Sie können sehen, dass ($)
kein Ersatz für (=<<)
ist, aber vielleicht können Sie auch sehen, dass sie etwas ähnlich sind. Eine Möglichkeit, dies zu betrachten, ist, dass (=<<)
- und damit auch (>>=)
- eine Art von Funktionsanwendung ist, die "monadische Funktionen" vom Typ a -> m b
für einige Monad m
auf "monadische Werte" vom Typ% anwendet. co_de% für einige Monad m a
, während m
die übliche Art von Funktionsanwendung ist, die Funktionen vom Typ ($)
auf Werte vom Typ a -> b
anwendet.
Eines der Monadengesetze ist das
%Vor%Dies bedeutet, dass
%Vor%kann auch als
geschrieben werden %Vor%was bedeutet, dass Ihre ursprüngliche Form in der Do-Notation auch so geschrieben werden kann.
Tags und Links haskell