Pet*_*lák 25 monads haskell functional-programming monad-transformers
我见过这个
ListT是一个不满足monad定律的有缺陷的monad变换器的典型例子.
这可以通过一个简单的例子来证明吗?
编辑:我的想法ListT []有点不对,我错过了文档要求内部monad是可交换的.那么,ListT只是在有这个要求的意义上,或者是否存在另一个问题?(Haskell wiki的例子都使用ListT IO,IO显然不是可交换的.)
Pet*_*lák 20
一个简单的例子,说明它如何通过相关性法则:
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]]
Run Code Online (Sandbox Code Playgroud)
更多示例(主要使用IO)和解决方法如何修复ListT可以在ListT完成右侧找到.