Equivalente a Scala da notação de Haskell (mais uma vez)

Eu sei que o de Haskell

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

pode ser expresso em Scala como

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

Mas, especialmente com mônadas, Haskell freqüentemente tem declarações dentro dodo bloco que não correspondem a qualquer<- ou=. Por exemplo, aqui está um código da Pandoc que usa o Parsec para analisar algo de uma string.

<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 você pode ver, ele salva a posição e a entrada, executa o analisador na sequência e, em seguida, restaura a entrada e a posição antes de retornar o resultado.

Eu não posso para a vida de mim descobrir como traduzirsetInput str, setInput oldInputesetPosition oldPos em Scala. Eu acho que funcionaria se eu simplesmente colocasse variáveis ​​sem sentido para poder usar<-, gostar

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

mas não tenho certeza se esse é o caso e, se estiver correto, tenho certeza de que deve haver uma maneira melhor de fazer isso.

Ah, e se você puder responder a essa pergunta, pode responder mais uma: quanto tempo tenho que encarar as Mônadas antes que elas não pareçam magia negra? :-)

Obrigado! Todd

questionAnswers(1)

yourAnswerToTheQuestion