Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 理解“导管”输出_Haskell - Fatal编程技术网

Haskell 理解“导管”输出

Haskell 理解“导管”输出,haskell,Haskell,使用导管,给定: Prelude> :t (yieldMany [1..10] .| mapC show .| mapC print .| sinkList) (yieldMany [1..10] .| mapC show .| mapC print .| sinkList) :: Monad m => ConduitM a c m [IO ()] 为什么没有记录任何输出 Prelude> runConduit $ yieldMany [1..10] .| mapC sh

使用导管,给定:

Prelude> :t (yieldMany [1..10] .| mapC show .| mapC print .| sinkList)
(yieldMany [1..10] .| mapC show .| mapC print .| sinkList)
  :: Monad m => ConduitM a c m [IO ()]
为什么没有记录任何输出

Prelude> runConduit $ yieldMany [1..10] .| mapC show .| mapC print .| sinkList
Prelude>
我的期望是,对于
[1..10]
流,将打印每个元素的
字符串
,即
显示
,值


请解释此输出。

导管的结果是单子中的
IO()
列表,而不是单个
IO()

即使您将
m
设置为
IO
,您最终也会得到
IO[IO()]
,结果不会显示,因为
[IO()]
没有
Show
实例。如果添加
>>=序列
,则可以修复此问题:

(runConduit $ yieldMany [1..10] .| mapC show .| mapC print .| sinkList) >>= sequence_
但是,真正的问题是使用
mapC打印
而不是
mapMC打印

Prelude Conduit> :t mapC
mapC :: Monad m => (a -> b) -> Conduit a m b
Prelude Conduit> :t mapMC
mapMC :: Monad m => (a -> m b) -> Conduit a m b
如果使用
mapC打印
,则最终会得到
导管a m(IO())
。如果使用
mapMC打印
,则最终会得到
导管a IO()
。后者将
m
设置为
IO
,前者不设置

因此,对一元函数使用正确的组合符:

runConduit $ yieldMany [1..10] .| mapC show .| mapMC print .| sinkNull
--                                                ^

此外,如果没有得到预期的结果,请检查GHCi中的
it
类型。

IIRC,您在最近的CR问题中遇到了类似的问题。遇到此类问题时,请使用带有类型批注的适当源文件。您经常会注意到,当您使用
IO
时,GHCi的工作原理有点不同。如果您添加类型批注,GHC将对您大喊大叫,
runconductor$…
的结果不是
IO[()]
,而是
IO[IO()]
runConduit $ yieldMany [1..10] .| mapC show .| mapMC print .| sinkNull
--                                                ^