2016-03-29 32 views
1

の数に制限は私がどのセルIを示す第1引数を設定カリー化機能を作りたいのは、私は3つの配列関数型プログラミング:あなたは、引数

var first = [0, 1, 2, 3]; 
var second = [0, 1, 2, 3]; 
var third = [0, 1, 2, 3]; 

を持っていると言うとる関数カレーができます引数として渡された配列の中に追加したいと思っています...理想的には配列の数を無制限にできるようにする関数が好きです....

例: は、配列のセル1に渡して一緒に追加します。

のでやって:

mycurriedfunction(1)(first)は1

mycurriedfunction(1)(first)(second)は2

mycurriedfunction(2)(first)(second)(third)は6

戻ってくる戻ってくる戻ってくるこれはさえ可能ですか?

もしそうでなければ、同様の結果を達成するための選択肢はありますか?

+0

だから、実行可能な数の種類がありますか?これは簡単だろうhttp://jsbin.com/xupaha/edit?js,console – iofjuupasli

+2

:: 'myFn(2、[第一、第二、第三])'あなたはこれを試すことができます。しかし、あなたのAPIは不可能です。 @iofjuupasliからのシミュレーションはおそらくあなたができる最高のものですが、特にそうではありません。 –

答えて

4

他にも言及したように、あなたが記述した関数は、次の関数を呼び出すか最終値を返すかを知る方法がありません。

あなたが本当に配列の無制限数を受け入れる似た何かを達成したい場合は、返された関数のプロパティとして累積値を格納するために、わずかにそれを適応させることができます。

function sumIdx(idx) { 
    function f(value) { 
    function g(arr) { 
     return f(value + arr[idx]); 
    } 
    g.value = value; 
    return g; 
    } 
    return f(0); 
} 

これは、違いはあなたが完了したら、valueプロパティオフ結果をプルする必要があることであることを、あなたの例のように使用することができます。

const first = [0, 1, 2]; 
const second = [3, 4, 5]; 
const third = [6, 7, 8]; 

sumIdx(2)(first)(second)(third).value // 15 

可能であれば、このアプローチを使用することはお勧めできません。おそらく、別のデータ型を使用すると、この動作を表現するのが良いでしょう(またはScott SauyetがmyFn(2, [first, second, third])に提案したようにAPIを変更する)。

class SumIdx { 
    constructor(idx, value) { 
    this.idx = idx; 
    this.value = value; 
    } 
    next(arr) { 
    return new SumIdx(this.idx, this.value + arr[this.idx]); 
    } 
} 

const sumIdx = idx => new SumIdx(idx, 0); 

ここでの違い

は、あなたが結果を直接呼び出すのではなく、 nextメソッドを呼び出す必要があるということです。

sumIdx(2).next(first).next(second).next(third).value // 15 
+0

あなたはただあなたを信じている誰かに毒を処方しました – naomik

4

いいえ、値は数値でも関数でもありません。

関数をリストにするか、リデューサーとして作成する必要があります。

関連する問題