是否有一些理由为什么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 的意图("非确定性计算"),似乎替代定义>>将同样好,如果不是更好,这要归功于修剪分支,保证等于一个.或者另一种说法是,如果我们处理集合而不是列表 …