为什么ListT monad变压器被认为是越野车
我已经提到过
  ListT是一个不符合单子法的ListT的典型例子。 
这可以通过一个简单的例子来证明吗?
  编辑:我对ListT []想法有点不对,我错过了文档要求内部monad是可交换的。  那么,仅仅是在有这个要求的意义上,还是存在另一个问题的是ListT越野车呢?  (Haskell维基上的例子都使用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]]
  更多的例子(主要是使用IO )和解决方案如何解决ListT可以在ListT中找到正确的。 
上一篇: Why is ListT monad transformer considered buggy
下一篇: Paypal Primary Receiver Pays the Fee in a Chained Payment
