今日の自作関数

今日は,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) []

このエラーが吐かれてたのね:)