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