Scala等效于Haskell';s do表示法(再次)

Scala等效于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;

我知道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;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