hayaのHaskell日記

2006-08-20

[] 3.2節 高階関数 12:27

メタ

引数関数を取れる関数のことを、高階関数(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 -> Char -> Bool

とすることによりコンパイルできた。ちゃんと<><>でChar同値評価もできているっぽい。

エラーメッセージを手がかりに検索した結果、Eqクラスが関係するらしいということはわかったが、クラスについてはまだわからないため、このエラーについては解決を先送りにしようと思う。

expand ver. 1

ふつケルのサンプルプログラムexpandでconcatをさりげなく使う感じがとてもいい。さりげなさ重要