导管中的无限循环源

时间:2012-07-04 05:40:44

标签: haskell conduit

我决定尝试使用导管,我认为我做得很好,但是当我尝试使用导管4制作这个简单的源时,我得到一个无限循环,我不明白为什么。这是简化的,原始版本将创建一个临时文件名并通过yield返回它。这只返回一个()。

import Control.Monad.IO.Class

import Data.Conduit
import Data.Conduit.List as CL

tempfiles :: MonadIO m => Source m ()
tempfiles = loop
  where
    loop = do
      x <- liftIO $ print "tempfile"
      yield x
      loop

如果我跑:

runResourceT $ (tempfiles $$ CL.take 5)

我得到一个无限循环。为什么它只运行五次并给我一个五(()s的列表?

1 个答案:

答案 0 :(得分:4)

在管道0.4中,产量不执行自动终止。这是0.5版本中的一个重要变化;你的代码在那里按预期工作。