gpt4 book ai didi

haskell - 为 Monad 脱糖 do-notation

转载 作者:行者123 更新时间:2023-12-03 11:01:38 28 4
gpt4 key购买 nike

当我学习 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 提供相应的绑定(bind)语句?

编辑。事实证明 #haskell 上的 lambdabot 可以做到这一点:
<Guest61347> @undo do x <- [3..4] ; [1..2] ; return (x, 42)
<lambdabot> [3 .. 4] >>= \ x -> [1 .. 2] >> return (x, 42)

这是 Undo plugin 的源代码.

最佳答案

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

首先,我们将您的代码放入模块 Foo.hs :

module Foo where

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

接下来,我们将要求 GHC 对其进行编译并在脱糖阶段后输出结果:
$ ghc -c Foo.hs -ddump-ds

输出可能看起来相当困惑,因为它是 Haskell 的一个变体,称为 Core,用作 GHC 的中间语言。但是,一旦习惯了它,阅读起来并不难。在其他一些定义的中间,我们找到了你的:
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重命名器添加的后缀,以及类型应用程序 @ Xyz以及对 GHC.Integer.smallInteger 的调用,并使运算符再次中缀,你会得到这样的东西:
Foo.a :: [(GHC.Integer.Type.Integer, GHC.Integer.Type.Integer)]
Foo.a = enumFromTo 3 4 >>= \x -> enumFromTo 1 2 >> return (x, 42)

关于haskell - 为 Monad 脱糖 do-notation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8019670/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com