112
83

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

カリー化と部分適用(JavaScriptとHaskell)

Last updated at Posted at 2014-10-14

カリー化と部分適用について簡単に説明します。特定の言語に依存しない概念を説明するのが目的ですが、例としてJavaScriptとHaskellを使用します。

JavaScript

カリー化と部分適用はよく混同されるので注意が必要です。

  • 関数を引数1つずつに分割してネストさせることをカリー化と呼びます。
  • 一部の引数を固定化して新しい関数を作り出すことを部分適用と呼びます。
非カリー化 カリー化
関数定義

function add(x, y) {
    return x + y;
}

function add(x) {
    return function(y) {
        return x + y;
    };
}
使用例

> add(1,2)
3

> add(1)(2)
3
部分適用

function add1(y) {
    return add(1, y);
}

var add1 = add(1);
使用例

> add1(2)
3

関数がカリー化されていれば、引数が足りないときに中間過程の関数が返って来ます。

> add1 = add(1)
[Function]
> add1.toString()
'function (y){return x+y;}'

add1xの値は1に固定化されているため、部分適用となります。

Haskell

Haskellの関数はデフォルトでカリー化されており、非カリー化はタプルで表現します。

非カリー化 カリー化
関数定義

add (x, y) = x + y

add x y = x + y
使用例

> add (1,2)
3

> add 1 2
3
部分適用

add1 y = add(1, y)

add1 = add 1
使用例

> add1 2
3

add x y = x + yadd = \x -> \y -> x + y の糖衣構文です。

Q&A

Q. カリー化は何が嬉しいの?
A. 部分適用が簡単にできます。

Q. 部分適用なんて使うの?
A. コールバックの特殊化で便利ですが、JavaScriptではあまり使わないかもしれません。

Q. コールバックの特殊化とは?
A. 一部だけ異なるコールバックを大量に用意するのではなく、共通関数に対する部分適用で済ませるということです。

Q. あまり使わないのになぜJavaScriptで説明したの?
A. 馴染みのない言語の縁のない概念というわけではないからです。

※ 投げ槍な解答ですが、実例を通して慣れるしかないと思います。

参考

Haskellで説明を書きました。

112
83
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
112
83

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?