11

結果として短い文字列を生成する、非常に時間のかかるアルゴリズムを作成しました。(putStrLn 経由で) 印刷しようとすると、文字ごとに画面に表示されます。なぜそれが起こったのか理解できたので、実際の印刷の前に文字列の評価を強制しようとしました。

myPrint !str = putStrLn str

しかし、これはほとんど役に立ちません。プログラムをデバッグで実行すると、!str が最初の文字のみを強制的に評価していることに気付きました。

その理由と、これに対処する方法を知っている人はいますか?

4

2 に答える 2

16

(!)seqこれは厳密にWeak Head Normal Formに評価されます。つまり、最も外側のコンストラクターにのみ評価されます。より深く評価するには、 の「深い」形式が必要ですseq

これは として知られていdeepseqます。

これはdeepseq パッケージにあります。

于 2011-04-05T20:27:38.087 に答える
2
seqList :: [a] -> ()
seqList [] = ()
seqList (x:xs) = strictList xs
于 2011-04-06T07:07:17.020 に答える