Why is ListT monad transformer considered buggy -

2019-01-25 02:19发布

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.)

1条回答
干净又极端
2楼-- · 2019-01-25 03:07

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.

查看更多
登录 后发表回答