Scala等效于Haskell';s do表示法(再次)
我知道HaskellScala等效于Haskell';s do表示法(再次),scala,haskell,monads,Scala,Haskell,Monads,我知道Haskell do x <- [1, 2, 3] y <- [7, 8, 9] let z = (x + y) return z 如您所见,它保存位置和输入,对字符串运行解析器,然后在返回结果之前恢复输入和位置 我一辈子都不知道如何将setInput str、setInput oldInput和setPosition oldPos翻译成Scala。我想如果我只是把无意义的变量放进去,这样我就可以使用是的,这个翻译是有效的 do{x>=\x->n,而do{m;
do
x <- [1, 2, 3]
y <- [7, 8, 9]
let z = (x + y)
return z
如您所见,它保存位置和输入,对字符串运行解析器,然后在返回结果之前恢复输入和位置
我一辈子都不知道如何将
setInput str
、setInput oldInput
和setPosition oldPos
翻译成Scala。我想如果我只是把无意义的变量放进去,这样我就可以使用是的,这个翻译是有效的
do{x>=\x->n
,而do{m;n}
相当于m>>n
。因为m>>n
被定义为m>=\\\\\\\\\\>/n
(其中
表示“不要将此值绑定到任何东西”),这确实是一个有效的翻译;do{m;n}/code>与do>相同{如果你不打算使用变量,你可以用下划线替换它的名字:\我想这是最像Scala的方法。不确定这是否真的可能,但如果把这些语句移到for的主体中,这看起来会更自然一些,在那里你可以真正使用过程风格。你知道Scala为什么不提供sugar for吗>
?我认为,因为scala以for的形式提供了对monad的理解。也许计算顺序没有得到维护。编辑:别介意它似乎得到了维护。monad的答案非常好。它只是一种编程模式。没有什么“黑魔法”.scala的>
糖,就理解力而言,实际上就是为{_
for {
x <- List(1, 2, 3)
y <- List(7, 8, 9)
z = x + y
} yield z
-- | 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
for {
oldPos <- getPosition
oldInput <- getInput
whyAmIHere <- setInput str
result <- parser
...
} yield result