Edited at

【Haskell】Preludeの関数いろいろ

More than 3 years have passed since last update.


目的

1. どんな関数が組み込まれているのかを知る

  → 組み込まれているのを知らずに自分で作ってしまうという事態を避ける

  → 完全に覚えていなくても、「こんなのあったような…」程度に思い出せれば十分

2. 自分で関数を定義する際の参考にする

  → 組み込まれている関数の定義は洗練されている

3. 使い方を妄想する


ソース

http://hackage.haskell.org/package/base-4.7.0.2/docs/Prelude.html

上から順に見ていきますが、四則演算など自明なものは省く

TODO

わかりやすいようにソースに沿った段落を入れる


関数

(&&) :: Bool -> Bool -> Bool

論理演算子のAND

Bool型の値2つを引数に取り、ともにTrueの時にTrueを返す。


*Main> (&&) True True

True

*Main> (&&) True False

False

*Main> (&&) False False

False



(||) :: Bool -> Bool -> Bool

論理演算子のOR

Bool型の値2つを引数に取り、どちらか片方がTrueであればTrueを返す。


not :: Bool -> Bool

論理演算子のNOT

Bool型の値1つを引数に取り、真偽を逆にして返す。


otherwise :: Bool

Trueを返す

ガードで処理を分岐させる際に用いる。

ガードの最後の条件をotherwiseにしておけばとりあえず抜け漏れはなくなる。


f x | x < 0 = ...

| otherwise = ...



(メモ)Bool型の「値」と書いてしまったがこれでいいんだろうか。厳密には値コンストラクタ?


maybe :: b -> (a -> b) -> Maybe a -> b

デフォルトとなる値、1引数関数、Maybe型の値の3つの引数を取る。

Maybeの値がNothingならデフォルトの値を返す。

Maybeの値がJust aならaを関数に渡した結果の値を返す。


maybe :: b -> (a -> b) -> Maybe a -> b

maybe n _ Nothing = n

maybe _ f (Just x) = f x


評価する際、Maybe型の値がNothingなら関数が、Justならデフォルト値が必要ないのでプレースホルダが使われている。


either :: (a -> c) -> (b -> c) -> Either a b -> c

1引数関数を2つとEither型の値1つで計3つの引数を取る。

Eitherの値がLeft aならaを1つめの関数に、Right bならbを2つめの関数に渡して結果の値を返す。


either :: (a -> c) -> (b -> c) -> Either a b -> c

either f _ (Left x) = f x

either _ g (Right y) = g y


maybeと同様に評価に必要ない箇所がプレースホルダになっている


fst :: (a, b) -> a

snd :: (a, b) -> b

いずれも2つの値からなるタプル1つを引数に取る。

fstは前の値、sndは後ろの値を返す。

関数名はそれぞれfirst、secondから。

これも定義にはプレースホルダが使われている。


curry :: ((a, b) -> c) -> a -> b -> c

カリー化されていない関数をカリー化する関数

自分で使うシチュエーションが思い浮かばない。


curry :: ((a, b) -> c) -> a -> b -> c

curry f x y = f (x, y)


タプルを引数に取る関数に対して値を2つ渡すという定義


uncurry :: (a -> b -> c) -> (a, b) -> c

カリー化された関数をタプルを取る関数にする


uncurry :: (a -> b -> c) -> ((a, b) -> c)

uncurry f p = f (fst p) (snd p)


関数を返すこともあってか型シグネチャのカッコがややこしい。

->にも結合の優先順位があるのでこうなるのかな。


succ :: a -> a

pred :: a -> a

succは与えられた引数に+1、predは-1した値を返す。

Ord型クラスであれば数値以外の値にも使える。


*Main> succ 'a'

'b'


「次の値」という意味ではない模様。

数値の場合には浮動小数点数でも+-1


toEnum :: Int -> a

Int型の値をEnum型に変換する。

型を揃えるために使う。


fromEnum :: a -> Int

Enum型の値をInt型に変換する。

Char型などにも使える。

Int型の範囲からオーバーフローするような値を渡すと想定外の結果になる。


enumFrom :: a -> [a]

aを受け取って[a..]の無限リストを返す。


enumFromThen :: a -> a -> [a]

a、a'を受け取って[a,a'..]の無限リストを返す。


enumFromTo :: a -> a -> [a]

enumFromThenTo :: a -> a -> a -> [a]

enumFrom、enumFromThenに上限をつけたもの。

それぞれ[n..m]、[n,n'..m]を返す。


negate :: a -> a

数値を受け取り正負を入れ替えたものを返す。

余談だが関数に負の数を渡すには(-1)のようにカッコがないといけない。

ついでに(-1)は例外的にセクションとして扱われない。


abs :: a -> a

絶対値を返す


signum :: a -> a

負の値に対して-1を、生の値に対して+1を、0に対して0を返す。

以下のルールを満たす。


abs x * signum x == x



fromInteger :: Integer -> a

Integerから多相型への変換

これも型を合わせるために使う。


toRational :: a -> Rational

Rational型への変換


quot :: a -> a -> a

第1引数 / 第2引数 の値を切り捨てで返す


rem :: a -> a -> a


div :: a -> a -> a


mod :: a -> a -> a


quotRem :: a -> a -> (a, a)

quotとremの結果を並べてタプルで返す


divMod :: a -> a -> (a, a)

divとmodの結果を並べてタプルで返す


toInteger :: a -> Integer

Integer型への変換


recip :: a -> a


recip x = 1 / x


逆数を返す


少し飛ばす


subtract :: (Num a) => a -> a -> a

subtract x y = y - x

(-) の引数を逆にしたものと同じ


even, odd :: (Integral a) => a -> Bool

even n = n rem 2 == 0

odd = not . even

even:引数が偶数(2で割った余りが0)ならTrue

odd:引数が奇数(evenがFalse)ならTrue