2006-08-20
■ [ふつケル] 3.2節 高階関数
メタ的
引数に関数を取れる関数のことを、高階関数(higher order function)。
square :: Int -> Int
square n = n * n
map square [1, 2, 3] #=> [1, 4, 9]
mapが高階関数。mapには、square [1,2,3]が評価されて渡されるのではなく、squareと[1,2,3]が別個に引数として渡される。Haskellでは、関数に当てられた名前は、ある処理を行う関数の実体に束縛された変数とみなすらしい。関数ポインタっぽい認識でOK? 高階関数のイメージとしては、値のみを引数にとる関数を、メタ的視点から操作できる関数、という感じだろうか。
あと、演算子の定義。等価(Haskellは同値性のみ)かどうかを評価する2項演算子==も一種の関数であり、関数名は(==)となる。この段階で、ふつケルには2項演算子の定義方法は出てこないが、少し調べて自分で2項演算子を定義する方法を見つけた。
point: 2項演算子は名前が記号だけで構成される関数である
たとえば、==と等価な2項演算子<><>が次のように定義できそうな気がする。
(<><>) :: a -> a -> Bool
a <><> b = a == b
しかし、実際にはコンパイルエラーとなる。ふつケルにある(==)関数の型宣言をそのまま真似しても動かないらしい。関数の型宣言を
とすることによりコンパイルできた。ちゃんと<><>でCharの同値性評価もできているっぽい。
エラーメッセージを手がかりに検索した結果、Eqクラスが関係するらしいということはわかったが、クラスについてはまだわからないため、このエラーについては解決を先送りにしようと思う。
expand ver. 1
コメントを書く
トラックバック - http://haskell.g.hatena.ne.jp/harg/20060820