IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

関数が第一級の対象であることの感覚とは?

多分こんな感じではないかと思っています。

通常は関数を定義して、それに値を与えます。例えばこんな感じ:

Prelude> let f1 = \x -> x * 2
Prelude> :t f1
f1 :: Integer -> Integer
Prelude> f1 4
8
Prelude> 

関数が第一級のクラスであるとは、関数の引数に関数を与えられるのと説明されます。例えば、f2という関数があったとして、

f2 (\x -> x ^ 3)

みたいなことが出来るということ。

試してみると:

Prelude> let f2 = \x -> x 3
Prelude> f2 (\x -> x ^ 3)
27
Prelude> 

f2は関数を受け取って、その関数に3を与える関数です。今回は、与えられた値を3乗する関数なので、3の3乗が27になります。

型を確認すると:

Prelude> :t f2
f2 :: (Integer -> t) -> t
Prelude> 

となっていて、 型が(Integer -> t)である関数を引数として、型がtの結果を返す関数になっています。

3の3乗の例が頭にあると、なんで(Integer -> Integer)である関数を引数として、Integerの結果を返す関数ではないのかと思ってしまいますが、Integerである必要はないということですね。

Integer -> Stringの関数を与えることも出来て、確認すると:

Prelude> f2 (\x -> show x)
"3"
Prelude> 

となります。

例のための例になっているので、これだけだとメリットがよくわかりませんが。。