関数のカリー化と部分適用
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/20 02:06 UTC 版)
「Haskell」の記事における「関数のカリー化と部分適用」の解説
Haskell において、2つの引数を持つ関数は、1つの引数をとり「1つの引数をとる関数」を返す関数と同義である。このように、関数を返すことで全ての関数を1つの引数の関数として表現することをカリー化という。(あえてタプルを使うことで複数の引数を渡すような見かけにすることもできるが。)次の例は2つの引数をとり、そのうち値が大きい値を返す関数 max である。 max a b = if a > b then a else b この関数maxは無名関数を用いて次のように書き換えることができる。先ほどの表現とまったく同様に動作するが、この表現では関数を返す様子がより明らかになっている。 max a = \b -> if a > b then a else b さらに、次のようにも書き換えることができる。 max = \a -> \b -> if a > b then a else b あるいは、f x = ... x ... は、 f = (\x -> ... x ...) の糖衣構文であるとも言える。このため、Haskell の定義は変数に束縛するのが定数であるか関数であるかにかかわらず、「変数 = 値」という一貫した形でも定義できる。 カリー化によって、Haskell のあらゆる関数は引数を部分適用することができる。つまり、関数の引数の一部だけを渡すことで、一部の変数だけが適用された別の関数を作り出すことができる。また、Haskell では演算子を部分適用することすら可能であり、演算子の部分適用をとくにセクションと呼ぶ。 任意のリストをとり、その要素から条件にあう要素のみを取り出す関数 filter が標準ライブラリに定義されている。 filter :: (a -> Bool) -> [a] -> [a] この関数では第一引数に残す要素を判定する関数をとるが、このときに部分適用を使えばそのような関数を簡潔に書くことができる。整数のリストから正の値のみを取り出す関数 positives は次のように定義できる。 positives :: [Int] -> [Int]positives = filter (> 0)ps = positives [-4, 5, 0, 3, -1, 9] -- [5, 3, 9] ここで、positives および filter の第2引数はソースコード上に現れずに記述できているが、このように単純に書けるのもカリー化の恩恵によるものである。
※この「関数のカリー化と部分適用」の解説は、「Haskell」の解説の一部です。
「関数のカリー化と部分適用」を含む「Haskell」の記事については、「Haskell」の概要を参照ください。
- 関数のカリー化と部分適用のページへのリンク