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

関数リテラル

リテラルとは

'c', "hello", 123のようにコードのなかに値を「直接」書きこむ表現がリテラルだ。変数や関数適用はリテラルではない。

% ghci
Prelude> 'c'
'c'
Prelude> "hello"
"hello"
Prelude> 123
123

関数リテラルとは

ここまでで学んだ定義では関数は変数に束縛する必要があった。関数リテラルなら関数に名前をつけずに使える。

var = 3と定義されているとき変数varを3でおきかえられる。では、fun x = x ^ xのように定義されているとき変数funを何でおきかえられるだろう。funをおきかえられるような表現が関数リテラルだ。関数自体をそのまま書いたものだ。

関数リテラルの例

% ghci
Prelude> let fun x = x ^ x
Prelude> fun 3
27

funの部分を関数リテラルで置き換える。関数リテラルは

\[仮引数] -> [表現]

という形だ。

Prelude> (\x -> x ^ x) 3
27

関数定義は構文糖だ

fun x = x ^ x

fun = \x -> x ^ x

に書きかえられる。関数定義は関数の作成とその関数での変数の束縛の2つのことをする構文糖だ。

xxcryptの例

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

xxcrypt = \n -> (\ed -> (\mc -> mc ^ ed `mod` n))

となる。

[3引数関数の図]

数値を返す関数を返す関数を返す関数だ。(->)は右結合なので丸括弧が省略できる。

xxcrypt = \n -> \ed -> \mc -> mc ^ ed `mod` n

複数引数の略記法

関数を返す関数は複数の引数をとる関数のように書ける。

xxcrypt = \n ed mc -> mc ^ ed `mod` n

まとめ

\[仮引数1] [仮引数2] ... -> [表現]

課題

  1. 金額を引数とし消費税込みの価格を返す関数taxを定義せよ
  2. 関数taxを関数リテラルで変数を束縛する形に書きかえよ
  3. 時間、分、秒を引数としてとり秒数に変換する関数secを作成せよ
  4. 関数secを関数リテラルで変数束縛する形に書きかえよ

「部分適用」へもどる 「高階関数」へ

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