为什么ListT monad变压器被认为是越野车

我已经提到过

ListT是一个不符合单子法的ListT的典型例子。

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

编辑:我对ListT []想法有点不对,我错过了文档要求内部monad是可交换的。 那么,仅仅是在有这个要求的意义上,还是存在另一个问题的是ListT越野车呢? (Haskell维基上的例子都使用ListT IOIO显然是不可交换的。)


一个简单的例子,显示它如何失败的联想法:

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中找到正确的。

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

上一篇: Why is ListT monad transformer considered buggy

下一篇: Paypal Primary Receiver Pays the Fee in a Chained Payment