2015-06-21 64 views
6

Data.SequencetakeWhileRdropWhileR用于从右侧高效解构Seq。然而,takeR,dropRsplitAtR显然不存在。 takedrop按照splitAt来实现。那么,手指树不会承认有效的splitAtR还是因为某些其他原因而不包括此功能?为什么从Data.Sequence中丢失了takeR,dropR和splitAtR?

(独立的,但有些相关的问题:请问在viewR方面幼稚dropR实现体面地执行好?)

这个问题是基于containers-0.5.6.3

+1

@dfeuer会成为Data.Sequence的专家,虽然我不知道我是否可以通过这种方式通知他。 –

+0

Github问题:[https://github.com/haskell/containers/issues/159](https://github.com/haskell/containers/issues/159)。 –

回答

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),我们可以忽略)。

+0

这是一个很好的观点,非常感谢。我会问@dfeuer为什么这些定义不在图书馆里。 –