次の例は、次の問題を示していますData.Sequence
。
{-# LANGUAGE BangPatterns #-}
module Main where
import qualified Data.Sequence as S
import Data.Sequence ((|>), ViewL(..))
import Data.List (foldl')
import GHC.AssertNF
update !init !x = init |> x
main =
do let !seq = foldl' update S.empty [1..10]
assertNF seq
印刷します
Parameter not in normal form: 1 thunks found:
Deep (One (S# 1)) (_thunk (Deep (One ...) (_thunk ... ... ... ...) (Three ... ... ...) 93) (S# 95) (S# 96) (S# 97)) (Three (S# 98) (S# 99) (S# 100)) 100
ただし、ドキュメントにはData.Sequence
すべての操作が厳密であると記載されているため、挿入後にツリーが完全に評価されないのはなぜですか?いくつかの複雑さの限界を保証する必要がありますか?
ここでの怠惰はあまり好きではないので|>
、後部への追加と前部からの列挙をサポートする、より厳密な、または同様のデータ構造があるのではないかと思います。