首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monad的去糖化do-notation

Monad的去糖化do-notation
EN

Stack Overflow用户
提问于 2011-11-05 18:44:17
回答 1查看 5.1K关注 0票数 27

当我学习Haskell时,我意识到do符号只是一种语法糖:

代码语言:javascript
复制
a = do x <- [3..4]
       [1..2]
       return (x, 42)

翻译为

代码语言:javascript
复制
a = [3..4] >>= (\x -> [1..2] >>= (\_ -> return (x, 42)))

我意识到我可能会使用do-notation,但我想了解翻译中发生了什么。因此,纯粹出于教学方面的原因,ghc/ghci有没有办法为一个用do-notation编写的相当复杂的monad提供相应的绑定语句?

编辑。事实证明#haskell上的lambdabot可以做到这一点:

代码语言:javascript
复制
<Guest61347> @undo do x <- [3..4] ; [1..2] ; return (x, 42)
<lambdabot> [3 .. 4] >>= \ x -> [1 .. 2] >> return (x, 42)

这是Undo plugin的源代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-05 19:25:44

您可以要求GHC的desugar的输出,但是这也会对许多其他语法进行desugar。

首先,我们将把您的代码放在一个模块Foo.hs

代码语言:javascript
复制
module Foo where

a = do x <- [3..4]
       [1..2]
       return (x, 42)

接下来,我们将要求GHC对其进行编译,并在去糖化阶段之后输出结果:

代码语言:javascript
复制
$ ghc -c Foo.hs -ddump-ds

输出可能看起来相当混乱,因为它是Haskell的一个变体,称为Core,用作GHC的中间语言。然而,一旦你习惯了它,阅读起来并不是太难。在其他一些定义中,我们找到了您的定义:

代码语言:javascript
复制
Foo.a :: [(GHC.Integer.Type.Integer, GHC.Integer.Type.Integer)]
LclIdX
[]
Foo.a =
  >>=_agg
    @ GHC.Integer.Type.Integer
    @ (GHC.Integer.Type.Integer, GHC.Integer.Type.Integer)
    (enumFromTo_ag7
       (GHC.Integer.smallInteger 3) (GHC.Integer.smallInteger 4))
    (\ (x_adf :: GHC.Integer.Type.Integer) ->
       >>_agn
         @ GHC.Integer.Type.Integer
         @ (GHC.Integer.Type.Integer, GHC.Integer.Type.Integer)
         (enumFromTo_ags
            (GHC.Integer.smallInteger 1) (GHC.Integer.smallInteger 2))
         (return_aki
            @ (GHC.Integer.Type.Integer, GHC.Integer.Type.Integer)
            (x_adf, GHC.Integer.smallInteger 42)))

核心不是很漂亮,但在使用GHC时能够读取它是非常有用的,因为您可以在以后的阶段阅读转储,以了解GHC是如何优化您的代码的。

如果我们删除由重命名程序添加的_xyz后缀,以及类型applications @ Xyz和对GHC.Integer.smallInteger的调用,并再次使操作符中缀,您将得到如下所示:

代码语言:javascript
复制
Foo.a :: [(GHC.Integer.Type.Integer, GHC.Integer.Type.Integer)]
Foo.a = enumFromTo 3 4 >>= \x -> enumFromTo 1 2 >> return (x, 42)
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8019670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档