2015-06-21 14 views
6

Data.SequencetakeWhileRdropWhileR cho giải cấu trúc hiệu quả Seq s từ cánh phải. Tuy nhiên, takeR, dropRsplitAtR là vắng mặt. takedrop được thực hiện về mặt splitAt. Vì vậy, đừng cây ngón tay không thừa nhận một hiệu quả splitAtR hoặc là chức năng này không bao gồm đối với một số lý do nào khác?Tại sao takeR, dropR và splitAtR bị thiếu trong Data.Sequence?

(câu hỏi riêng biệt nhưng phần nào liên quan: Sẽ một ngây thơ dropR thực hiện về viewR thực hiện decently tốt?)

Câu hỏi này được dựa trên containers-0.5.6.3.

+1

@dfeuer sẽ là chuyên gia về Data.Sequence, mặc dù tôi không biết nếu tôi có thể thông báo cho anh ấy theo cách này. –

+0

Github vấn đề: [https://github.com/haskell/containers/issues/159](https://github.com/haskell/containers/issues/159). –

Trả lời

8

length là O (1), vì vậy splitAt đủ để xác định mọi thứ bạn cần, một cách hiệu quả.

splitAtR i s = splitAt (length s - i) s 
takeR i s = snd $ splitAtR i s 
dropR i s = fst $ splitAtR i s 

Theo các tài liệu, chi phí splitAtO(log(min(i,length s-i))), vì vậy bằng cách đối xứng splitAtR chi phí như nhau (chỉ thêm +O(1), mà chúng ta có thể bỏ qua).

+0

Đó là một điểm rất tốt, cảm ơn bạn rất nhiều. Tôi sẽ hỏi @dfeuer tại sao những định nghĩa này không có trong thư viện. –

Các vấn đề liên quan