为什么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