【Haskell】Preludeの関数いろいろ

##目的
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
***
****
***
****