えーと。
すごいHaskellの61ページから「高階関数」というものの説明が始まっています。
Prelude> :t max max :: Ord a => a -> a -> a
(本にある記述ではないです。あたしの手元のghciさんに吐かせた中身)
で、これを本では、次のようにも書けますという。
max :: (Ord a) => a -> (a -> a)
はい。はい?
矢印->を型シグネチャに含むものはすべて関数です
(すごいHaskellのp.62)
a->bの「a->」と「->b」と、どっちに捉えたらいいのやら?
最後(右端)にあるのは返り値であるということからすると、「a->」って考えればいいのかな。
a+b+cを返すみたいなのを書いてみる
Prelude> let foo x y z = x + y + z Prelude> foo 9 10 11 30
型をみてみる
Prelude> :t foo foo :: Num a => a -> a -> a -> a
このばあいのー、まずいろんな成分を分けないといけない。あたしが読解する用に。
Prelude> :t foo foo :: (Num a) => a -> a -> a -> a
「Num a」を括弧でくくって、視線から離す。残った問題の「a -> a -> a -> a」を考える。
矢印->を型シグネチャに含むものはすべて関数です
関数に渡すものは変数であると覚えたあたしの脳が、この1行を飲み込むのを拒絶する。厳しい。
a -> a -> a ↑おなじ↓ a -> (a -> a)
は、aの型を引数に取りa->aを返す関数と読むことができると書いてある。
a -> a -> a -> a ↓ a -> (a -> a -> a) ↓ a -> (a -> (a -> a))
みたいな?みたいなと書いてはいますがぜんぜん飲み込めない。いまはまだ、あたしの脳の外周を水カビみたいに浮いてる考え方だ。知恵でなく知識。
aばっかりで全然分からぬ。
x -> y -> z -> v ↓ x -> (y -> z -> v) ↓ x -> (y -> (z -> v))
書き換えてみる。
xを引数で渡して、「y -> (z -> v)」って関数を返す。
その「y -> (z -> v)」は、「z -> v」って関数を返す。
値vが返る。
この無限にタマネギを剥くような感覚。
関数の部分適用という考え方があった。
Prelude> (+) 3 4 7 Prelude> (+) 3:1:1: No instance for (Show (a0 -> arising from a use of `prin Possible fix: add an instance In a stmt of an interactive G Prelude> ((+) 3) 4 7
ここはなんとなーく分かるようになってきたが、染み込んでない。
型シグネチャっていうの?抽象的な表記をされたとたん、あたしの脳が「これは難しいものだ危険!」みたいになって、受取拒否をしているかのようですよ。
どっかでとつぜん染み込んだりするようになったりするものなので、しばらくはこの負荷をかけ続ける所存でございます。はやくこいブレークスルー。