【发布时间】:2011-11-05 10:44:17
【问题描述】:
在学习 Haskell 时,我意识到 do 符号只是语法糖:
a = do x <- [3..4]
[1..2]
return (x, 42)
翻译成
a = [3..4] >>= (\x -> [1..2] >>= (\_ -> return (x, 42)))
我意识到我可能会使用 do-notation,但我想了解翻译中发生了什么。所以纯粹出于教学原因,ghc/ghci 有没有办法为我用 do-notation 编写的相当复杂的 monad 提供相应的绑定语句?
编辑。事实证明 #haskell 上的 lambdabot 可以做到这一点:
<Guest61347> @undo do x <- [3..4] ; [1..2] ; return (x, 42)
<lambdabot> [3 .. 4] >>= \ x -> [1 .. 2] >> return (x, 42)
这是Undo plugin的源代码。
【问题讨论】:
-
其实
m >>= (\_ -> k)是m >> k -
Lambdabot 有一个“撤消”插件,可以脱糖标记
-
我只是在学习,感觉这是真正理解特定实例细节的关键——它们都是用 >>= 的形式编写的
标签: haskell monads do-notation