2015-06-21 9 views
6

Data.Sequence ha takeWhileR e dropWhileR per la decostruzione efficiente di Seq da destra. Tuttavia, takeR, dropR e splitAtR sono assenti. take e drop sono implementati in termini di splitAt. Quindi, le barrette non ammettono un efficiente splitAtR o questa funzionalità non è stata inclusa per qualche altro motivo?Perché takeR, dropR e splitAtR mancano da Data.Sequence?

(domanda separata, ma in qualche modo correlato: Sarebbe un ingenuo dropR implementazione in termini di viewR svolgere decentemente bene?)

Questa domanda si basa su containers-0.5.6.3.

+1

@dfeuer sarebbe l'esperto di Data.Sequence, anche se non so se posso avvisarlo in questo modo. –

+0

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

risposta

8

length è O (1), quindi splitAt è sufficiente per definire tutto ciò che è necessario, in modo efficiente.

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

Secondo la documentazione, splitAt costa O(log(min(i,length s-i))), così da simmetria splitAtR costa stessa (solo un ulteriore +O(1), che possiamo trascurare).

+0

Questo è un ottimo punto, molte grazie. Chiederò a @dfeuer perché queste definizioni non sono nella libreria. –