Scala equivalente a la notación de Haskell (una vez más)

Se que haskell

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

Se puede expresar en Scala como

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

Pero, especialmente con las mónadas, Haskell a menudo tiene declaraciones dentro de lado bloque que no corresponde a ninguno<- o=. Por ejemplo, aquí hay algo de código de Pandoc que usa Parsec para analizar algo de una cadena.

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

Como puede ver, guarda la posición y la entrada, ejecuta el analizador en la cadena y luego restaura la entrada y la posición antes de devolver el resultado.

No puedo, por mi vida, descubrir cómo traducir.setInput str, setInput oldInputysetPosition oldPos en Scala. Creo que funcionaría si solo coloco variables sin sentido para poder usar<-, me gusta

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

pero no estoy seguro de que ese sea el caso y, si es correcto, estoy seguro de que debe haber una mejor manera de hacerlo.

Ah, y si puedes responder a esta pregunta, ¿puedes responder una más? ¿Cuánto tiempo tengo para mirar a Monads antes de que no se sientan como magia negra? :-)

¡Gracias! Todd

Respuestas a la pregunta(1)

Su respuesta a la pregunta