myLength :: [a] -> Int
myLength [] = 0
myLength (_:xs) = 1 + myLength xs
myNull :: [a] -> Bool
myNull [] = True
myNull _ = False
myHead :: [a] -> a
myHead (x:_) = x
myHead [] = error "empty list"
myTail :: [a] -> [a]
myTail (_:xs) = xs
myTail [] = error "empty list"
myLast :: [a] -> a
myLast (x:[]) = x
myLast (_:xs) = myLast xs
myLast [] = error "empty list"
myInit :: [a] -> [a]
myInit (_:[]) = []
myInit (x:xs) = x : myInit xs
myInit [] = error "empty list"
myPlusPlus :: [a] -> [a] -> [a]
myPlusPlus [] ys = ys
myPlusPlus (x:xs) ys = x : myPlusPlus xs ys
myConcat :: [[a]] -> [a]
myConcat [] = []
myConcat (x:xs) = x `myPlusPlus` (myConcat xs)
myReverse :: [a] -> [a]
myReverse [] = []
myReverse xs = (myLast xs):(myReverse $ myInit xs)
myAnd :: [Bool] -> Bool
myAnd [] = True
myAnd (x:xs) = x && myAnd xs
myOr :: [Bool] -> Bool
myOr [] = False
myOr (x:xs) = x || myOr xs
myAll :: (a -> Bool) -> [a] -> Bool
myAll _ [] = True
myAll f (x:xs) f x && myAll f xs
myAny :: (a -> Bool) -> [a] -> Bool
myAny _ [] = False
myAny f (x:xs) = f x || myAny f xs