JavaScrip/etc/カリー化

JavaScrip/etc/カリー化

よく関数型言語で出てくる手法にカリー化というモノがある。

複数の引数を取る関数を1つの引数と残りの引数の結果を返す関数に変形するという操作になる。

このような関数を

function hoge(a, b, c){
    return a + b + c;
}

このように変形できる。

function hoge(a){
    return function(b){
        return function(c){
            return a + b + c;
        };
    };
}

なにか騙されているだけのような気もする これをそれぞれ使うとすると

hoge(1, 2, 3); // 6
hoge(1)(2)(3); // 6

こうなる。このようなカリー化された関数をアローで作りたい場合素直に書くとこうなる

var hoge = (a) => {
    return (b) => {
        return (c) => {
            return a + b + c;
        };
    };
};

アロー関数の省略記法で処理が1行の場合は return が省略できるというのがある。

var hoge = (a) => {
    (b) => {
        (c) => {
            return a + b + c;
        };
    };
};

もう一つ、処理が1つの場合は括弧も省略できる

つまりこうなるのである。

var hoge = a => b => c => a + b + c;

このような連続のアロー記号が使われていたらそれは複数のアロー元の変数を引数に取りアロー先の関数を返す関数だと思えばヨイ。

このようなカリー化にどのようなメリットがあるというと・・・JS的には特に無いと、実用の実装よりもそういう概念だから。

無理に考えるならば、インターフェースの適合ということができる。 大体の言語において関数の戻り値は単一値に限定されている。

なぜかというとわかりやすいからである。

それならば、関数の引数が1個という縛りがあってもいいだろう。

特にフレームワークやライブラリで扱う場合、使う関数のインターフェースが全部統一されているというのは設計上のメリットになりうるのではないか?

javascript/etc/currying.txt · 最終更新: 2020-01-06 12:32 by ore