
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.