gpt4 book ai didi

haskell - 为什么 `>>` 的 list monad 方法没有定义为 `flip const` ?

转载 作者:行者123 更新时间:2023-12-01 07:00:53 27 4
gpt4 key购买 nike

Prelude 没有像这样定义列表 monad 有什么原因吗? (注意 >> 的非标准实现。)

instance  Monad []  where
m >>= k = concat (map k m)
m >> k = k -- a.k.a. flip const
return x = [x]
fail s = []

我试着根据 monad 法律检查这个,但他们没有提到 >> . Monad类定义是这样的:
m >> k = m >>= \_ -> k

其中在 []实例将转换为:
concat (map (\_ -> k) m)

这当然不等同于 flip const ——它们产生了明显不同的结果,比如 [1..5] >> return 1 .但我不清楚这个默认定义是否是 Monad 实例的法律。必须遵守,或者只是满足 flip const 的其他一些法律的默认实现实现也会满足。

直观地说,考虑到列表 monad(“非确定性计算”)的意图,它似乎是 >> 的替代定义。由于修剪分支保证等于一个,即使不是更好,也会一样好。或者换一种说法是,如果我们处理的是集合而不是列表,那么这两个候选定义将是等价的。但是我是否在这里遗漏了一些微妙之处,使 flip const列表定义错误?

编辑 :ehird 的回答发现了上面的一个非常明显的缺陷,那就是它得到了错误的预期结果 [] >> k ,应该是 [] , 不是 k .不过,我认为这个问题可以修改为这个定义:
[] >> k = []
_ >> k = k

最佳答案

a >> b必须始终等于 a >>= const b ;它只在 Monad类,以便您可以定义更有效(但语义等效)的版本。这就是为什么它不是 monad 定律的一部分:它实际上不是 monad 定义的一部分,只是类型类(如 fail )。

不幸的是,我在基本包的文档中找不到任何明确说明这一点的地方,但我认为旧版本可能已经定义了 (>>)Monad类型类。

对于它的值(value),您对 (>>) 的定义打破了列表 monad 对非确定性计算的使用。自 []用于表示失败,[] >> m必须始终是 [] ;用尽所有可能的分支后,您将无法继续!这也意味着这两个程序:

do { m; ... }
do { _ <- m; ... }

行为可能有所不同,因为前者使用 (>>) 进行脱糖后者是 (>>=) . (请参阅 Haskell 2010 Report。)

关于haskell - 为什么 `>>` 的 list monad 方法没有定义为 `flip const` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10490852/

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