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