RWH 4.5.1, 4.5.4

-- 4.5.1 基本的なリストの処理
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"

-- 4.5.4 単純なリスト処理
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
--myAnd (x:xs) = if x
--               then myAnd xs
--               else False

myOr :: [Bool] -> Bool
myOr [] = False
myOr (x:xs) = x || myOr xs
--myOr (x:xs) = if x
--              then True
--              else myOr xs


myAll :: (a -> Bool) -> [a] -> Bool
myAll _ [] = True
myAll f (x:xs) f x && myAll f xs
--myAll f (x:xs) = if f x
--                 then myAll f xs
--                 else False

myAny :: (a -> Bool) -> [a] -> Bool
myAny _ [] = False
myAny f (x:xs) = f x || myAny f xs
--myAny f (x:xs) = if f x
--                 then True
--                 else myAny f xs