4

コンジットのハンドルを取得しようと決め、うまくやっていると思っていましたが、コンジット 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)

私は無限ループを取得します。5 回実行して 5 つの () のリストを表示しないのはなぜですか?

4

1 に答える 1

4

コンジット 0.4 では、yield は自動終了を実行しません。これは 0.5 リリースでの重要な変更です。あなたのコードは期待通りに動作します。

于 2012-07-04T06:37:15.687 に答える