関数が第一級の対象であることの感覚とは?
多分こんな感じではないかと思っています。
通常は関数を定義して、それに値を与えます。例えばこんな感じ:
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>
となります。
例のための例になっているので、これだけだとメリットがよくわかりませんが。。