4

Haskell(素敵な言語)を学ぶために、私はSpojから問題を試しています。

コンパイル時にすべて既知の19000要素のテーブルがあります。'seq'を使用してテーブルを厳密にするにはどうすればよいですか?これが私のコードからの(強力な)単純化された例です。

import qualified Data.Map as M

-- table = M.fromList . zip "a..z" $ [1..]  --Upps, incorrect. sorry
table = M.fromList . zip ['a'..'z'] $ [1..]
4

2 に答える 2

5

データ構造の完全な評価を強制するために使用されるdeepseqinを探していると思います。Control.DeepSeq

その型シグネチャはdeepseq :: NFData a => a -> b -> bであり、2 番目の引数を返す前に最初の引数を完全に評価することによって機能します。

table = t `deepseq` t
  where t = M.fromList . zip ['a'..'z'] $ [1..]

ここにはまだ怠惰が残っていることに注意してください。table使用しようとするまで評価されませんが、その時点でマップ全体が評価されます。

luqui が指摘したようにData.Map、そのキーはすでに厳密であるため、これを行うことは、値も厳密にしたい場合にのみ意味があることに注意してください。

于 2011-05-14T12:02:40.333 に答える
3

一般的な答えは、データ構造全体の評価を強制する必要があるコードを作成することです。たとえば、リストがある場合:

 strictList xs = if all p xs then xs else []
      where p x = x `seq` True

そのような強制を再帰的に適用する型クラスと、標準データ型のインスタンスがすでにあると確信しています。

于 2011-05-14T10:13:22.893 に答える