我看过提到



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

编辑:我的ListT []想法有点错误,我错过了documentation要求内部monad是可交换的。那么,ListT buggy 只是在具有此要求的意义上,还是存在另一个问题? (examples at Haskell wiki都使用ListT IO,而IO显然不是可交换的。)

最佳答案

一个简单的示例,说明它如何使关联律失效:

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的解决方案。

10-05 18:30