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

非カリー化

Haskellにおける非カリー化とは

関数curryはタプルとして引数をうけとる関数をばらばらの引数をうけとる関数に変換する。逆にばらばらの引数をうけとる関数をタプルとして引数をうけとる関数に変換することを非カリー化と呼ぶ。関数uncurryがある。

整数の組の足し算

2つで1組の値に対してばらばらの引数を取る関数を適用したい。「整数の組の値を足した値を計算する」などだ。uncurryを使う。

% ghci
Prelude> uncurry (+) (3, 8)
11

関数uncurry

整数の組の足し算の例では、Integer -> Integer -> Integer(Integer, Integer) -> Integerに変換する。

(Integer -> Integer -> Integer) -> ((Integer, Integer) -> Integer)

一般的にする。

(a -> b -> c) -> ((a, b) -> c)

右側の丸括弧を省略する。

(a -> b -> c) -> (a, b) -> c

定義

uncurry :: (a -> b -> c) -> (a, b) -> c
uncurry f (x, y) = f x y

[関数uncurryの図]

第2引数のタプル(x, y)の第1、第2要素をばらばらにして第1引数の関数fに与える。

課題

  1. 第1引数に値段を第2引数に税率をとり税込み価格を返す関数を作成せよ
  2. 上記関数をuncurryで値段と税率から成るタプルをとる関数に変換せよ
  3. 第2引数と第3引数を第1引数で割った余りが等しいことを確認する関数congruentを作成せよ
  4. 3引数関数を3要素タプルをとる関数に変換する関数uncurry3を定義せよ

「カリー化」へもどる 「タプルにおける構文糖」へ

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