2015-06-21 11 views
6

Data.Sequence hat takeWhileR und dropWhileR für die effiziente Dekonstruktion von Seq s von rechts. Jedoch sind takeR, dropR und splitAtR deutlich abwesend. take und drop sind in Bezug auf splitAt implementiert. Also, geben Finger Bäume keine effiziente splitAtR oder war diese Funktionalität aus einem anderen Grund nicht enthalten?Warum fehlen TakeR, DropR und SplitAtR aus Data.Sequence?

(Separate aber etwas damit verbundene Frage: Wäre eine naive dropR Umsetzung in Bezug auf viewR führt anständig gut?)

Diese Frage auf containers-0.5.6.3 basiert.

+1

@dfeuer wäre der Experte für Data.Sequence, obwohl ich nicht weiß, ob ich ihn auf diese Weise benachrichtigen kann. –

+0

Github-Problem: [https://github.com/haskell/containers/issues/159](https://github.com/haskell/containers/issues/159). –

Antwort

8

length ist O (1), so splitAt genügt, um alles, was Sie brauchen, auf effiziente Weise zu definieren.

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

die Dokumentation nach, splitAt kostet O(log(min(i,length s-i))), so durch Symmetrie splitAtR die gleichen Kosten (nur eine zusätzliche +O(1), die wir vernachlässigen können).

+0

Das ist ein sehr guter Punkt, vielen Dank. Ich werde @dfeuer fragen, warum diese Definitionen nicht in der Bibliothek sind. –