gpt4 book ai didi

list - Haskell:列表单子(monad)中的变量范围

转载 作者:行者123 更新时间:2023-12-04 16:25:33 25 4
gpt4 key购买 nike

我正在阅读一本关于列表单子(monad)的在线 Haskell 书籍。在书中,list monad 是这样定义的:

instance Monad [] where  
return x = [x]
xs >>= f = concat (map f xs)
fail _ = []

然后有一个这样的 list monad 用法示例:
Prelude> [1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch)  
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]

我是 Haskell 的新手,我对这个例子的问题是,变量 'n' 如何在 return (n,ch) 的 lambda 表达式中可用? . n在另一个 lambda 表达式中定义,我不明白为什么在一个 lambda 表达式中定义的变量在后续 lambda 表达式中可用。我尝试根据列表单子(monad)定义转换如下示例:
Prelude> concat (map (\ch -> return (n, ch)) (concat (map (\n -> ['a', 'b']) [1, 2])))

<interactive>:32:29: error: Variable not in scope: n

但是正如你所看到的,我得到一个错误,说变量 n在其他 lambda 表达式的范围内不可用。也许这本书只是介绍了列表单子(monad)定义的简化版本?

最佳答案

[1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch)  

不被解析为
[1,2] >>= (\n -> ['a','b']) >>= (\ch -> return (n,ch))

但作为
[1,2] >>= \n -> (['a','b'] >>= (\ch -> return (n,ch)))

您的翻译与 concat / map反射(reflect)了“错误”的解析。我们可以将其调整为正确的。

第一个 >>=变成
concat (map (\n -> ???) [1,2])

现在我们可以翻译内部 >>=替换 ???如所须:
??? = concat (map (\ch -> ???2) ['a','b'])
???2= return (n,ch)

结果:
concat (map (\n -> concat (map (\ch -> return (n,ch)) ['a','b'])) [1,2])

关于list - Haskell:列表单子(monad)中的变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377867/

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