Eric Olander wrote:
Hi,
I'm still somewhat new to Haskell, so I'm wondering if there are
better ways I could implement the following functions, especially shiftl:
>> moves the first element to the end of the list
shiftr :: [a] -> [a]
shiftr [] = []
shiftr (x:y) = y ++ [x]
>> moves the last element to the head of the list
shiftl :: [a] -> [a]
shiftl [] = []
shiftl x = [last x] ++ init x
If you use Data.Sequence (new in 6.6, I think), these can be O(1):
import qualified Data.Sequence as Seq
import Data.Sequence ( (<|), (|>), (:<), (:>) )
shiftr seq = go (Seq.viewl seq)
where
go (EmptyL) = Seq.empty
go (e :< remain) = remain |> e
shiftl seq = go (Seq.viewr seq)
where
go (EmptyR) = Seq.empty
go (remain :> e) = e <| remain
Decomposing by elements like this is a bit unwieldy, but using the
functions in Data.Traversable and Data.Foldable it shouldn't be too bad,
depending on what you're doing.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe