top page > computer > haskell > web_lecture > for_programmer > partial_application.html
更新日:
文責: 重城良国

部分適用

rsa.hs

関数xxcrypt

encrypt関数とdecrypt関数は同じだ。

encrypt n e m = m ^ e `mod` n
decrypt n d c = c ^ d `mod` n

まとめる。

xxcrypt n ed mc = mc ^ ed `mod` n

鍵を固定する

いちいち引数として与えるのではなく鍵を指定しておく。

encrypt m = xxcrypt 138689 13 m
decrypt c = xxcrypt 138689 95497 c

*Main> :reload
*Main> encrypt 4492
47255
*Main> decrypt 47255
4492

encryptやdecryptの定義はxxcryptの第1、第2引数だけの指定だ。仮引数mやcを消すことができる。

encrypt = xxcrypt 138689 13
decrypt = xxcrypt 138689 95497

この定義ではencrypt、decryptの3つの引数のうち第1引数と第2引数のみを与えている。引数の一部だけ指定することを部分適用と呼ぶ。第1引数のみの指定もできる。

xxcrypt1 = xxcrypt 138689

関数encrypt, dectryptはこれを使って定義できる。

encrypt = xxcrypt1 13
decrypt = xxcrypt1 95497

関数を返す関数

encrypt 4492
=> (xxcrypt1 13) 4492
=> ((xxcrypt 138689) 13) 4492

xxcryptに引数138689を与えると関数xxcrypt1が返る。xxcrypt1に引数13を与えると関数encryptが返る。encryptに4492を与えると数値になる。

[3引数関数の図]

3引数関数に引数を与えると2引数関数が返る。2引数関数に引数を与えると1引数関数が返る。1引数関数に引数を与えると数値が返る。

3引数関数は幻だった

関数xxcryptを3引数関数として扱った。本当はHaskellに2引数関数や3引数関数はない。「2引数関数や3引数関数のようなもの」は「関数を返す関数」だ。

xxcrypt 138689 13 4492

関数に3つの引数を与えているように見える。明示的に丸括弧をつける。

((xxcrypt 138689) 13) 4492

関数適用が左結合なのでこの括弧は省略できる。結果としてうえのようになる。

まとめ

関数は引数の一部だけを指定できる。この「部分適用」は特別に用意された機能ではない。「複数の引数を持つ関数」のほうが幻だ。その正体は「関数を返す関数」だ。

課題

  1. n進法の2桁の値を計算する関数naryを作成せよ
  2. 関数naryを使って8進法の2桁の値を計算する関数octalを作成せよ

「関数を作る」へもどる 「関数リテラル」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics