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があるのかな.
よし,それじゃ今日はコレぐらいで.