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

Se que haskell

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

Se puede expresar en Scala como

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

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

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

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&nbsp;en Scala. Creo que funcionaría si solo coloco variables sin sentido para poder usar<-, me gusta

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

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