練習問題 4.3.7

便利な関数
takeWhile
および
dropWhile
は,第1引数が自然数ではなく論理関数であることを除けば
take
および
drop
と同じである. この点からいえば
filter
ともよく似ている.
takeWhile p xs
の値は,
xs
の先頭部分リストのうち,すべての要素について
p

を満たす最長のものである. 例を挙げると次のとおり.

takeWhile even [2,4,6,1,5,6] = [2,4,6]
dropWhile p xs
の値はその残りの部分である. 例を挙げると以下のとおり.


dropWhile even [2,4,6,1,5,6] = [1,5,6]
takeWhile
および
dropWhile
を再帰的に定義せよ.



takeWhile           ::  (a -> Bool) -> [a] -> [a]
takeWhile _ []      =   []
takeWhile p (x:xs)
  | p x             =   x : takeWhile p xs
  | otherwise       =   []

dropWhile           ::  (a -> Bool) -> [a] -> [a]
dropWhile _ []      =   []
dropWhile p xxs@(x:xs)
  | p x             =   dropWhile p xs
  | otherwise       =   xxs