I'm re-implementing the common core functions that work on list as a learning exercise. I'm new to Haskell and often find myself staring at what I've written trying to determine the simpler or more elegant solution I'm certain exists. I'm also unsure about my naming conventions, since there are some things the style guides I've read don't really cover. I'd appreciate any advice or criticism.
foldl' :: (b -> a -> b) -> b -> [a] -> b foldl' f accumulator  = accumulator foldl' f accumulator (x:xs) = seq accumulator' $ foldl' f accumulator' xs where accumulator' = f accumulator x
I wrote this for the ListOps https://exercism.io challenge, which had a requirement about strictness.
foldr :: (a -> b -> b) -> b -> [a] -> b foldr f accumulator  = accumulator foldr f accumulator (x:xs) = f x (foldr f accumulator xs)
length :: [a] -> Int -- Deliberately not using a fold length = length' 0 length' :: Int -> [a] -> Int length' accumulator [x] = 1 length' accumulator (x:xs) = 1 + length' accumulator xs length' accumulator 
map :: (a -> b) -> [a] -> [b] map f  =  map f [x] = [f x] map f (x:xs) = f x:map f xs
filter :: (a -> Bool) -> [a] -> [a] filter _  =  filter f (x:xs) | f x = x : filter f xs | otherwise = filter f xs
(++) :: [a] -> [a] -> [a] xs ++  = xs xs ++ ys = foldr (:) ys xs