2015-06-21 59 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爲什麼這些定義不在圖書館裏。 –