我决定尝试处理管道,我认为我做得很好,但是当我尝试使用管道 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)
我得到一个无限循环。为什么它不只运行五次并给我一个包含五个 () 的列表?