Scala odpowiednik notacji Haskella (jeszcze raz)

Wiem, że to Haskell

<code>do
  x <- [1, 2, 3]
  y <- [7, 8, 9]
  let z = (x + y)
  return z
</code>

można wyrazić w Scali jako

<code>for {
  x <- List(1, 2, 3)
  y <- List(7, 8, 9)
  z = x + y
} yield z
</code>

Ale, szczególnie w przypadku monad, Haskell często ma oświadczenia wewnątrzdo blok, który nie odpowiada żadnemu<- lub=. Na przykład, oto kod z Pandoc, który używa Parsec do parsowania czegoś z ciągu znaków.

<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>

Jak widać, zapisuje pozycję i dane wejściowe, uruchamia analizator składni na łańcuchu, a następnie przywraca dane wejściowe i pozycję przed zwróceniem wyniku.

Nie mogę przez całe życie wymyślić, jak tłumaczyćsetInput str, setInput oldInput, isetPosition oldPos do Scala. Myślę, że to zadziałałoby, gdybym po prostu włożył bzdurne zmienne, abym mógł użyć<-, lubić

<code>for {
  oldPos <- getPosition
  oldInput <- getInput
  whyAmIHere <- setInput str
  result <- parser
  ...
} yield result
</code>

ale nie jestem pewien, czy to przypadek, a jeśli jest poprawny, jestem pewien, że musi być lepszy sposób na to.

Aha, a jeśli potrafisz odpowiedzieć na to pytanie, czy możesz odpowiedzieć jeszcze raz: jak długo muszę wpatrywać się w Monady, zanim nie poczują się jak czarna magia? :-)

Dzięki! Todd

questionAnswers(1)

yourAnswerToTheQuestion