記事の内容
関数型言語であるHaskellについてまとめたい。今回の記事では、おもに、「関数と型」についてまとめる。
Haskellを使用する際には、中心的な概念になる。この使い方こそ、手続き型言語とは、大きく違うところである。関数型言語の特徴をつかむための基礎として押さえておきたい。まとめてみる。
関数
関数の基本
関数の使い方と関数の作り方
>>mod 15 4 3 >>foo x y = (x - 1) * y - (x + 3) >>foo 8 5 24
多引数関数の正体
Haskellに多引数関数はない!!!!
高階関数・・・関数を引数にとったり、関数を返す
>>(foo 8) 5 24
パターンマッチ
分岐と、値の取り出しができる。
>>qux (Just x) = x *2; qux Nothing = 0 >>qux (Just 5) 10 >>qux Nothing 0
ガード
ブール値へのパターンマッチには、ガードと呼ばれる書き方ができる。
>>quux x | x <= 0 = 0 | otherwise = x *2 >>quux 8 16 >>quux (- 5) 0
型
型によって、その値に適用可能な関数と、その値を返す関数が決定される。
関数も値なので、型がある。関数の型は、引数の型と返り値の型であらわす。多引数関数に見えるものは、関数を返す関数であることに注意。型宣言で、変数の型を定義する。
>>:type isDigit isDigit :: Char -> Bool >>num1, num2 :: Integer fun1 :: Char -> Integer -> Bool
多相関数
・複数の型の値が、引数となる、または
・複数の型のうち、どれかの値を返す
片方か、または両方を満たす関数を、多相関数とする。この多相性は、「構造の部分だけを扱い、中の値をいじらない」または、「値の扱いは、引数としてとった関数にまかせる」ことで保つ。
そのままにする
id :: a -> a id x = x >> id 8 8
値を無視する
const :: a -> b -> a const :: x _ = x >>const 'c' False 'c'
関数適用と関数合成
それぞれの定義を示す。
($) :: (a -> b) -> a -> b f $ x = f x (.) :: (b -> c) -> (a -> b) -> a -> c (f . g) x = f (g x)
例えば、次のような置き換えができる。これは、. の結合力が、$よりも強いことを示す。
>>fun c = even $ (`mod` 7) $ ord $ toLower c >>fun' c = even . (`mod` 7) . ord $ toLower c
値に関数を適用する部分だけは、関数適用の($)を使うことに注意。関数適用と関数合成の意味が混ざってしまえば、記号の使用もこんらんする。意味に注意。