Help us understand the problem. What is going on with this article?

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

カリー化と部分適用について簡単に説明します。特定の言語に依存しない概念を説明するのが目的ですが、例として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. あまり使わないのになぜJavaScriptで説明したの?
A. 関数型言語の知識を前提にしないで説明したかったからです。

Q. 処理を関数で渡すとは?
A. そういう組み方で何か作ってみないとピンと来ないと思います。

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

参考

Haskellで説明を書きました。

7shi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした