相关疑难解决方法(0)

为什么`>>`的list monad方法不能定义为`flip const`?

是否有一些理由为什么Prelude没有像这样定义列表monad?(注意非标准的实现>>.)

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

我试图按照monad法律对此进行检查,但他们没有提及>>.在Monad类的定义是这样的:

m >> k = m >>= \_ -> k
Run Code Online (Sandbox Code Playgroud)

[]实例中将转换为:

concat (map (\_ -> k) m)
Run Code Online (Sandbox Code Playgroud)

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

直观地,考虑到列表monad 的意图("非确定性计算"),似乎替代定义>>将同样好,如果不是更好,这要归功于修剪分支,保证等于一个.或者另一种说法是,如果我们处理集合而不是列表 …

monads haskell

3
推荐指数
1
解决办法
367
查看次数

标签 统计

haskell ×1

monads ×1