Haskell 理解ListIO示例

Haskell 理解ListIO示例,haskell,Haskell,以下是作者精心编写的: TL;DR:若你们在GHCi中看到了一些你们并没有预料到的东西,那个么想想产生这种结果的线的类型 test的类型为ListT IO()。如果我们在ListT ma上使用runListT,我们最终得到的是m[a]: *Main> runListT test ([1,2],'a') ([1,2],'b') [(),()] runListT :: Monad m => ListT m a -> m [a] test :

以下是作者精心编写的:


TL;DR:若你们在GHCi中看到了一些你们并没有预料到的东西,那个么想想产生这种结果的线的类型


test
的类型为
ListT IO()
。如果我们在
ListT ma
上使用
runListT
,我们最终得到的是
m[a]

*Main> runListT test
([1,2],'a')
([1,2],'b')
[(),()]
runListT      :: Monad m => ListT  m  a  ->  m  [a]
test          ::            ListT IO ()
runListT test ::                            IO [()]
由于可以显示
[()]
(而不是
()
),GHCi将显示结果。如果绑定它,您将看不到它:

*Main> res <- runListT test
([1,2],'a')
([1,2],'b')
*Main> res
[(),()]

这是提升的输出。
*Main> res <- runListT test
([1,2],'a')
([1,2],'b')
*Main> res
[(),()]
*Main> let runListT_ m = runListT m >> return ()
*Main> runListT_ test
([1,2],'a')
([1,2],'b')