2016-03-29 7 views
1

Скажем, у меня есть 3 массивовФункционального программирования с Ramda: Можете ли вы Карри функции, которая принимает неограниченное число аргументов

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

Я хотел бы сделать каррированную функцию, где я установил первый аргумент, указывающий, какие ячейки I хотел бы добавить среди массивов, передаваемых в качестве аргументов ... в идеале я хотел бы функцию, чтобы иметь возможность принимать неограниченное количество массивов ....

Например: mycurriedfunction(1) будет означать, я хотел бы получить доступ к значению в ячейке 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, [first, second, third])'. Но ваш 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 

Хотя возможно, я, вероятно, не рекомендую использовать этот подход. Возможно, использование отдельного типа данных было бы лучше для представления этого поведения (или изменения вашего API, как Скотт Сойет предложил myFn(2, [first, second, third])).

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

Нет, это невозможно, чтобы значение было как числом, так и функцией.

Вы должны сделать свою функцию вместо списка или сформулировать ее как редуктор.

 Смежные вопросы

  • Нет связанных вопросов^_^