Unten ist ein Code, der von der Antwort auf another stack overflow question kommt. Es ist schon einige Wochen her, dass ich angefangen habe, Haskell zu studieren, und ich musste dieser besonderen Syntax noch begegnen, und ich kann nirgendwo eine Erklärung finden, nicht einmal eine Definition dafür. So , der Code:Haskell, Monad, Definition der Bindung und seltsame Mustererkennung auf einem Ausgabewert?
data Pair a = P a a
instance Functor Pair where
fmap f (P x y) = P (f x) (f y)
instance Monad Pair where
return x = P x x
P a b >>= f = P x y
where P x _ = f a
P _ y = f b
verbrachte ich die letzte halbe Stunde versucht, den Sinn des Lebens zu verstehen, oder wenn etwas kannte ich schon die Definition dieses bind (>> =) Verfahren erläutert. GHCI lud es ohne Ärger ein (naja, es verlangte eine anwendbare Instanz, aber anders als das), also muss es sehr erlaubt sein, auch wenn ich den Anfang davon noch nicht verstanden habe.
Was bedeutet eine Definition, die durch Mustererkennung eines bereits definierten Datenkonstruktors aussieht? Was sind x und y, woher kommen sie?
Danke an alle, die darauf antworten. Und wenn jemand eine gute Idee für einen guten, spezifischen Titel zu dieser Frage hat - vorausgesetzt, dass ich die sehr syntaktische Bedeutung nicht wirklich verstehe, habe ich Schwierigkeiten, eine solche zu finden.
@leftaroundabout gab mir die Informationen, die ich brauchte, das war, dass das Stück Code
P x y
where P x _ = f a
P _ y = f b
eine Form von Pattern-Matching des "Value-Unboxing" Typ war, anstatt die case of
ähnlich wie auswahlorientiert. Ich wurde durch das Vorhandensein des _
Muster verblüfft, und so sah ich die oben genannten zwei Muster-Matchings nicht, wie sie waren, das heißt, wie die Definitionen von x
dann y
, weil es in einer Weise gemacht wurde, die ich nie erlebt hatte Vor.
Ich wusste, dass wir so etwas schreiben könnten:
f :: foo -> (Int, Int)
...
i = let (a,b) = f x
in a + b
aber ich wusste nicht, dass wir in diesen Fällen von „value-Unboxing“ verwenden könnten (hier a
und b
zum Beispiel, oder x
und y
in dem Code, der mich abhörte), das volle Ausmaß der Möglichkeiten im Muster-Matching, das heißt, zumindest Definitionen, die _
verwenden, um die Teile zu isolieren, die wir nicht wollen, die Werte, die wir nicht an irgendwelche binden wollen "Etikette".
Kurz gesagt ich nicht, dass in dem obigen Beispiel nicht kannte, diese Gleichung
P x _ = f a
eigentlich die Definition von x
durch Pattern-Matching auf dem Ergebnis der (f a)
war, so dass es in der Tat absolut gleichwertig war zu
x = g (f a)
where g (P t _) = t
ich dachte, es war die Definition der bereits definierten Daten Konstruktor P
stecken.
Nun, wenn ich es richtig übersetzen, bedeutet dies, dass offenbar kann man Muster-Match in umgekehrter , Teile eines Musters aus Variablen definieren, die, na ja, vom selben Muster sind, also könnte ich anscheinend schreiben: 'let (a, _) = (1,2); (_, b) = (3,4) in (a, b) == (1,4) '. Diese Fähigkeit, Werte durch sukzessive "partielle" Musterübereinstimmung zu definieren, indem Bits von anderen Variablen genommen werden, ist etwas, das ich einfach ignoriert habe. Ich kannte es ohne '_', grundsätzlich, außer natürlich bei der Definition von Funktionen, aber implizit ist es hier völlig anders, findest du nicht? – icelake
Übrigens haben Sie 'pFst (Pair _ y) = y 'geschrieben, waren aber Opfer des Copy-Paste Hex, wie es' pSnd' hätte sein sollen. Und danke, natürlich. Ich habe versucht, meinen vorherigen Kommentar zu bearbeiten, aber er wurde abgelehnt. – icelake
Ich bin neu bei SOverflow, muss ich etwas Besonderes machen, jetzt wurde es gelöst? – icelake