gpt4 book ai didi

haskell - 使用 haskell monad 理解作用域

转载 作者:行者123 更新时间:2023-12-02 02:50:39 27 4
gpt4 key购买 nike

我试图了解作用域在 do 块中是如何工作的。

如果我有以下代码:

l = [1, 2, 3]
m = [1, 2]

那么这工作正常
res = do
a <- l
b <- m
return (a, b)

并返回 m 的笛卡尔积和 l .

为了理解范围,我尝试以不同的形式重写它(没有 do 块)

我知道 do 块只是 monadic 操作上的语法糖,所以我试图“取消糖化”它并使用 this并想出了这个:
res = l >>= (\a -> m) >>= (\b -> return (a, b))

奇怪的是我收到这个错误 Not in scope: ‘a’ .

谁能告诉我我在哪里做错了,可能还有范围是如何工作的,因为它看起来真的很神奇, return在 do 块中能够访问一个 ?

非常感谢

最佳答案

问题是代码中 lambda 的范围不太正确。它应该一直延伸到表达式的末尾,而不仅仅是围绕小计算。你的代码应该去糖

 l >>= (\a -> m >>= (\b -> return (a, b))

顺便说一下,您可以去掉括号,这样会更愉快一些。
 l >>= \a -> m >>= \b -> return (a, b)

但这种方式掩盖了意义。如果你想痛苦地明确,我们可以转换为前缀表示法并说
 bind a f = a >>= f
bind l (\a -> bind m (\b -> return (a, b))

也许剥离一些运营商的糖会有所帮助。

注意 >>='s 如何嵌套在 lambda 内部,而不是在它周围。这确保了 a仍在范围内。事实上,这种嵌套手工写出来有点痛苦,这是 do-notation 的动力之一:)

关于haskell - 使用 haskell monad 理解作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36431489/

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