我知道,Haskell的
do
x <- [1, 2, 3]
y <- [7, 8, 9]
let z = (x + y)
return z
可以在Scala中表示为
for {
x <- List(1, 2, 3)
y <- List(7, 8, 9)
z = x + y
} yield z
但是,特别是与单子,Haskell中往往具有内部的语句do
块不对应于任一<-
或=
。 例如,下面是从Pandoc一些代码,使用秒差距解析字符串中的东西。
-- | 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
正如你所看到的,它保存的位置和输入,运行在串分析器,然后返回结果前恢复该输入和位置。
我不能为我的生活弄清楚如何翻译setInput str
, setInput oldInput
和setPosition oldPos
到斯卡拉。 我想,如果我只是把废话变量,所以我可以用它的工作<-
像
for {
oldPos <- getPosition
oldInput <- getInput
whyAmIHere <- setInput str
result <- parser
...
} yield result
但我不知道是这样的话,如果它是正确的,我敢肯定,必须有一个更好的方式来做到这一点。
哦,如果你能回答这个问题,你能回答一个更:我有多久的单子盯着他们不喜欢黑魔法面前? :-)
谢谢! 托德