为什么ListT单子变换器被认为是错误的 - 它破坏了monad法则?

时间:2012-09-27 09:12:59

标签: haskell functional-programming monads monad-transformers

我见过提到

  

ListT是一个有缺陷的monad变换器的典型示例,不满足monad laws

这可以通过一个简单的例子来证明吗?

编辑:我对ListT []的想法有点不对,我错过了documentation要求内部monad是可交换的。那么,ListT只是在有这个要求的意义上,还是有其他问题? (examples at Haskell wiki全部使用ListT IOIO显然不是可交换的。)

1 个答案:

答案 0 :(得分:19)

一个简单的例子,展示了它如何通过相关性法:

v :: Int -> ListT [] Int
v 0 = ListT [[0, 1]]
v 1 = ListT [[0], [1]]

main = do
    print $ runListT $ ((v >=> v) >=> v) 0
    -- = [[0,1,0,0,1],[0,1,1,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1]]
    print $ runListT $ (v >=> (v >=> v)) 0
    -- = [[0,1,0,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0,1],[0,1,1,0],[0,1,1,1]]

可以在ListT done right找到更多示例(主要使用IO)和解决方法如何修复ListT