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