Why is ListT monad transformer considered buggy

I've seen mentioned that

ListT is a classic example of a buggy monad transformer that doesn't satisfy the monad laws.

Can this be demonstrated by a simple example?

Edit: My idea with ListT [] is a bit wrong, I missed that the documentation requires the inner monad to be commutative. So, is ListT buggy just in the sense that has this requirement, or is there another problem? (The examples at Haskell wiki all use ListT IO and IO is obviously not commutative.)


A simple example that shows how it fails the associativity law:

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]]

More examples (mostly using IO ) and a solution how to fix ListT can be found at ListT done right.

链接地址: http://www.djcxy.com/p/77358.html

上一篇: 这个Monad Stack函数的名字是什么?

下一篇: 为什么ListT monad变压器被认为是越野车