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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage