Prelude"のつづき"*4
昨日はmapまでやりました.やっとmなんだなぁ.maximumは前にやったので,maybeから.
maybe
突然パンチが効いてる.例と,型
a -> (b -> a) -> Maybe b -> a
を見る限り,maybeに与えられたMaybe bがJust bなら,(b->a)をbに適用して,その結果を返す.Nothingなら,aをそのまま返す.ってことみたいだ.
Hugs.Base> maybe 5 abs (Just (-4)) 4 Hugs.Base> maybe 5 abs Nothing 5
うん,それっぽい.よし,書いてみるぞ.
maybe' :: a -> (b -> a) -> Maybe b -> a maybe' a f (Just b) = f b maybe' a f Nothing = a
こんな感じか?
Main> maybe' 5 abs (lookup 4 [(3,-5),(4,-7)]) 7 Main> maybe' 5 abs (lookup 2 [(3,-5),(4,-7)]) 5
かな?
negate
与えられた数の符号を逆に変える.
negate' :: Num a => a -> a negate' a = a * (-1)
何も考えずにこうかな,と思って書いたんだけど,Preludeのほうは
negate x = 0 - x
だった.な,なるほど・・・.
notElem
elemの逆.与えられたリストに含まれて"いなければ"Trueを返す.
notElem' :: Eq a => a -> [a] -> Bool notElem' _ [] = True notElem' a (x:xs) | a == x = False | otherwise = notElem' a xs
何と言うか,ただelemTrueとFalseを換えただけ.
or
ただ,配列の中にTrueがあったらTrueを返すだけ.elemで簡単に実装できるな.
or' :: [Bool] -> Bool or' x = elem True x
pred
Enumで,一個前のを返す.5なら4,BならAとなぁ.succの逆って事ね.
pred' :: Enum a => a -> a pred' a = toEnum ((fromEnum a) - 1)
これで良いはず.Preludeは,なんかいちいちカッコええ.
pred = toEnum . (subtract 1) . fromEnum
そういえば,まだ"."の使い方が分かんないので,今日の自作関数はお休みして"."の勉強でもするか.
productはまぁわかる.quotやremってのはdivやmodとどう違うのだろうか.
Preludeを見て素敵だと思ったのは,divとmodがあるからdivModがあるのではなく,divModがあるからdivとmodがあるってこと.
-- Minimal complete definition: -- quotRem, toInteger (中略) divMod n d = if signum r == - signum d then (q-1, r+d) else qr where qr@(q,r) = quotRem n d
もっと言えばquotRemがあるからdivModがあるのかな.
よし,それじゃ今日はコレぐらいで.