我见过提到
ListT
是一个有缺陷的monad变换器的典型示例,不满足monad laws。
这可以通过一个简单的例子来证明吗?
编辑:我对ListT []
的想法有点不对,我错过了documentation要求内部monad是可交换的。那么,ListT
只是在有这个要求的意义上,还是有其他问题? (examples at Haskell wiki全部使用ListT IO
和IO
显然不是可交换的。)
答案 0 :(得分:19)
一个简单的例子,展示了它如何通过相关性法:
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
。