Scala-Äquivalent von Haskells Do-Notation (noch einmal)
Ich kenne das von Haskell
<code>do x <- [1, 2, 3] y <- [7, 8, 9] let z = (x + y) return z </code>
kann in Scala ausgedrückt werden als
<code>for { x <- List(1, 2, 3) y <- List(7, 8, 9) z = x + y } yield z </code>
Aber besonders bei Monaden hat Haskell häufig Aussagen in derdo
Block, der auch nicht entspricht<-
oder=
. Hier ist zum Beispiel ein Code von Pandoc, der Parsec verwendet, um etwas aus einer Zeichenfolge zu analysieren.
<code>-- | Parse contents of 'str' using 'parser' and return result. parseFromString :: GenParser tok st a -> [tok] -> GenParser tok st a parseFromString parser str = do oldPos <- getPosition oldInput <- getInput setInput str result <- parser setInput oldInput setPosition oldPos return result </code>
Wie Sie sehen, werden die Position und die Eingabe gespeichert, der Parser für die Zeichenfolge ausgeführt und dann die Eingabe und die Position wiederhergestellt, bevor das Ergebnis zurückgegeben wird.
Ich kann für mein ganzes Leben nicht herausfinden, wie ich übersetzen sollsetInput str
, setInput oldInput
, undsetPosition oldPos
in Scala. Ich denke, es würde funktionieren, wenn ich nur Unsinn-Variablen einsetze, damit ich sie verwenden kann<-
, mögen
<code>for { oldPos <- getPosition oldInput <- getInput whyAmIHere <- setInput str result <- parser ... } yield result </code>
Aber ich bin mir nicht sicher, ob das der Fall ist, und wenn es richtig ist, muss es einen besseren Weg geben, dies zu tun.
Oh, und wenn Sie diese Frage beantworten können, können Sie noch eine Frage beantworten: Wie lange muss ich Monaden anstarren, bevor sie sich nicht wie schwarze Magie anfühlen? :-)
Vielen Dank! Todd