0

独自のストリーミング コードを作成するにはどうすればよいでしょうか。私は約 1,000,000,000 組のウォー デッキをランダムに生成していました。それらをフォールドに遅延ストリーミングしたかったのですが、スペース リークが発生しました。コードの関連セクションは次のとおりです。

main = do
    games <- replicateM 1000000000 $ deal <$> sDeck --Would be a trillion, but Int only goes so high
    let res = experiment Ace games --experiment is a foldl'
    print res --res is tiny

-O2 を付けて実行すると、最初にコンピュータがフリーズし始め、次にプログラムが停止し、コンピュータが復活します (そして、Google Chrome には、すべてのリソースを使い果たしたことを私に怒鳴るのに必要なリソースがあります)。

注: unsafeInterleaveIO を試しましたが、うまくいきませんでした。

完全なコードはhttp://lpaste.net/109977にあります。

4

2 に答える 2

2

同等のpipes解決策は次のとおりです。

import Pipes
import qualified Pipes.Prelude as Pipes

-- Assuming the following types
action :: IO A
acc    :: S
step   :: S -> A -> S
done   :: S -> B

main = do
    b <- Pipes.fold step acc done (Pipes.replicateM 1000000 action)
    print (b :: B)
于 2014-08-25T15:59:37.327 に答える