【发布时间】:2013-02-08 09:44:16
【问题描述】:
以下示例显示了我们在使用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 的文档声称所有操作都是严格的,那么为什么插入后树没有完全评估?是否需要保证一些摊销的复杂性界限?
这里我们不太喜欢懒惰,所以不知道有没有更严格的|>或者类似的支持后面追加和前面枚举的数据结构,可能更高效?
【问题讨论】:
-
“我们不太喜欢这里的懒惰” ...您可能使用了错误的语言:)
-
@singpolyma:事实上,Haskell 非常适合我们 :)
标签: haskell data-structures sequence lazy-evaluation