好きをブチ抜く

「好き」をブチ抜く

本、映画、科学、哲学、心理、すごい人の考え方など。あらゆる情報を編集したい。

Haskell 【関数と型 入門】 関数、多引数関数の正体に注意

記事の内容

関数型言語であるHaskellについてまとめたい。今回の記事では、おもに、「関数と型」についてまとめる。

Haskellを使用する際には、中心的な概念になる。この使い方こそ、手続き型言語とは、大きく違うところである。関数型言語の特徴をつかむための基礎として押さえておきたい。まとめてみる。




Haskell 教養としての関数型プログラミング

こちらの本から、「関数と型」についてまとめたい。基礎から丁寧に学ぶことができるいい本だと思う。






関数

関数の基本

関数の使い方と関数の作り方

>>mod 15 4
3

>>foo x y = (x - 1) * y - (x + 3)
>>foo 8 5
24

多引数関数の正体

Haskellに多引数関数はない!!!!


式foo 8 は1引数関数を返す。それにさらに、引数5を与えている。

高階関数・・・関数を引数にとったり、関数を返す

>>(foo 8) 5
24

関数リテラル

関数の作成方法。関数定義とのちがいは?

>>bar = \x y -> (x -1) * y -(x + 3)

演算子

演算子は、中置記法の2引数関数。演算子は、()で関数になり、関数は ` で囲むと演算子になる。

>>10 `mod` 4
2

>>(+) 5 8
13

パターンマッチ

分岐と、値の取り出しができる。

>>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  

値に関数を適用する部分だけは、関数適用の($)を使うことに注意。関数適用と関数合成の意味が混ざってしまえば、記号の使用もこんらんする。意味に注意。