導管の結果はモナドでIO()
のリストではなく、単一IO()
です:あなたはm
IO
に設定しても
Prelude Conduit> :t runConduit $ yieldMany [1..10] .| mapC show .| mapC print .| sinkList
runConduit $ yieldMany [1..10] .| mapC show .| mapC print .| sinkList
:: Monad m => m [IO()]
、あなたはしない、結果としてIO [IO()]
に終わります[IO()]
にはShow
インスタンスがないため、表示されます。あなたは>>= sequence_
を追加した場合ということで解決できます。
(runConduit $ yieldMany [1..10] .| mapC show .| mapC print .| sinkList) >>= sequence_
しかし、本当の問題は、あなたがmapC print
代わりのmapMC print
を使用することである:
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 print
を使用する場合は、あなたがConduit a m (IO())
で終わります。 mapMC print
を使用すると、最終的にConduit a IO()
になります。後者はm
からIO
に設定されますが、最初はそうではありません。
だから、モナドの関数の正しいコンビネータを使用する:あなたが期待する結果を得ていない場合
runConduit $ yieldMany [1..10] .| mapC show .| mapMC print .| sinkNull
-- ^
また、GHCiの中it
の種類を確認してください。
IIRCでは、最近のCRの質問にも同様の問題がありました。このような問題が発生した場合は、アノテーションタイプの適切なソースファイルを使用してください。 'IO'を使うとGHCiが少し違うことに気付くでしょう。タイプアノテーションを追加すると、GHCは 'runConduit $ ...'の結果が 'IO [()]'ではなく 'IO [IO()]'であることを叫ぶでしょう。 – Zeta