Data.Sequence
具有 takeWhileR
和 dropWhileR
,用于从右侧高效解构 Seq
。但是,takeR
、dropR
和 splitAtR
明显不存在。 take
和 drop
是根据 splitAt
实现的。那么,手指树是否不承认有效的 splitAtR
或者是否由于其他原因未包含此功能?
(独立但有些相关的问题:就 viewR
而言,一个简单的 dropR
实现会表现得很好吗?)
此问题基于containers-0.5.6.3
.
最佳答案
length
是 O(1),因此 splitAt
足以以有效的方式定义您需要的一切。
splitAtR i s = splitAt (length s - i) s
takeR i s = snd $ splitAtR i s
dropR i s = fst $ splitAtR i s
根据文档,splitAt
成本 O(log(min(i,length s-i)))
,因此通过对称 splitAtR
成本相同(只是一个额外的 +O(1)
,我们可以忽略)。
关于haskell - 为什么 Data.Sequence 中缺少 takeR、dropR 和 splitAtR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30966910/