以下示例显示了我们遇到的问题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
声称所有操作都是严格的文档,那么为什么在插入后没有对树进行完全评估?是否需要保证一些摊销的复杂性界限?
我们这里不是很喜欢懒惰,所以不知道有没有更严格|>
或者类似的数据结构,支持后面追加和前面枚举,可能更高效?