Data.Sequence
有takeWhileR
和dropWhileR
,可以从右侧有效解构Seq
s。但是,takeR
,dropR
和splitAtR
显然不存在。 take
和drop
是根据splitAt
实施的。那么,指树不能承认有效splitAtR
,还是出于其他原因不包括此功能?
(单独但有些相关的问题:dropR
的{{1}}实施方式表现得不错吗?)
此问题基于containers-0.5.6.3
。
答案 0 :(得分:8)
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)
,我们可以忽略)。