Nachdem ich das Beispiel einer RPN calculator in "Lernen Sie eine Haskell für großes Gutes!" Ich wollte es auf eine allgemeinere Art und Weise neu schreiben.Wie schreibe ich diesen Case-Ausdruck mit der View-Pattern-Syntax?
Um die verfügbaren Funktionen einfach zu erweitern, lege ich diese in getrennte Listen und Muster, die mit der ViewPatterns
Syntax der lookup
Funktion übereinstimmen. Um die Eingabe mit read
zu lesen schrieb ich folgendes:
parse xs x = case readMaybe x of
Just x -> Right (x : xs)
Nothing -> Left "Syntax error
aber ich möchte lieber einen Fall Ausdruck vermeiden und verwenden Sie wieder die Ansicht Muster wie folgt aus:
parse xs (readMaybe -> Just x) = Right (x : xs)
parse xs (readMaybe -> Nothing) = Left "Syntax error"
jedoch mit diesem erhalte ich Dieser Fehler: No instance for (Read a0) arising from a use of ‘readMaybe’
Ich verstehe nicht warum. Sind sie nicht gleichwertig?
Der gesamte Code ist here.
Ok, danke. Ich werde den Fall behalten. – Rnhmjoj
View-Muster sind sehr nützlich, wenn Sie eine Funktion mit vielen Fällen haben, aber die Fälle sind mit Funktionen gemacht, die ein Maybe zurückgeben, und Sie passen nie wirklich auf den Zwischentyp. Dinge wie 'f x | Nur y <- g0 x = ...; Nur y <- g1 x = ... 'gegen' f (g0 -> Nur y); f (g0 -> Just y) '- Letzteres ist viel schöner, weil es keine nutzlose Variable bindet (' x' im ersten Fall). – user2407038
Es lohnt sich, Pattern Matching zu unterstützen, das Zwischenberechnungen verwendet. Das Problem ist, dass Ansichtsmuster nur diesem Just-or-Bust-Stil gute Unterstützung bieten. Wir sollten mehr als einen Biss am Ergebnis einer Zwischenuntersuchung haben können, ohne die linke Seite verlassen zu müssen.Aber ich stimme zu, dass unnötige zusätzliche Benennung nervig ist, also könnte es nützlich sein, eine kompaktere Notation zu haben (wenn die Zwischenberechnung nur von einer Mustervariable abhängt und einmal gematcht wird) und ich will auch nichtlineare Muster anstelle eines zusätzlichen Namens und Gleichheitswächter. – pigworker