ではありません。あなただけの通常のseq
を使用する場合はHeapTタイプは
data HeapT prio val
= Empty --^An empty 'HeapT'.
| Tree { _rank :: {-# UNPACK #-} !Int --^Rank of the leftist heap.
, _size :: {-# UNPACK #-} !Int --^Number of elements in the heap.
, _priority :: !prio --^Priority of the entry.
, _value :: val --^Value of the entry.
, _left :: !(HeapT prio val) --^Left subtree.
, _right :: !(HeapT prio val) --^Right subtree.
} --^A tree node of a non-empty 'HeapT'.
deriving (Typeable)
として定義され、それが弱いヘッド正規形、すなわちいずれかEmpty
またはTree
コンストラクタにヒープを評価します。サイズフィールドは厳密なので、ヒープの背骨を完全に評価します。
これを入力するときに新しい項目をdeepseq
と組み合わせると、ヒープが完全に評価されます。
let insert' item heap = item `deepseq` Data.Heap.insert item heap
let newheap = insert' item heap
in newheap `seq` do_something_else
これは、パフォーマンスが悪化する場合は驚くことではありません。ヒープパッケージは岡崎の実装を使用しているため、特定のパフォーマンス保証のために怠惰に依存しています。それを試してみてください。
メンテナをポーリングして必要なインスタンスを追加する方法はありますか? – fuz