今日の自作関数
今日は,maximum関数を自作.
まずはオーソドックスな所から.
maximum1 :: Ord a => [a] -> a maximum1 [] = error "empty list" maximum1 (x:xs) | null xs = x | otherwise = if x > (head xs) then maximum1 (x:(tail xs)) else maximum1 xs
ガード使ってif使って,なんだか忙しい.関数にリストを連結して渡すときは,括弧で括らないと駄目なのね.
次は,maxを使って.
maximum2 :: Ord a => [a] -> a maximum2 [] = error "empty (ry" maximum2 (x:xs) | null xs = x | otherwise = maximum2 ((max x (head xs):(tail xs)))
かなりスッキリ.どんどんスッキリさせるぞ.
そもそも,maximumのエラーメッセージを見てみると・・・
Main> maximum[] Program error: pattern match failure: foldl1 (Ord_max instOrd_v29) []
と出た.なにぃ,foldl1を使っているのか.そこで,foldl1を使って書いてみると,
maximum3 :: Ord a => [a] -> a maximum3 [] = error "em(ry" maximum3 (x:xs) = foldl1 (max) (x:xs)
さらにスッキリ!
Main> foldl1 (max) [] Program error: pattern match failure: foldl1 (Ord_max instOrd_v29) []
このエラーが吐かれてたのね:)