2017-02-15 12 views
0

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

Скажем, у меня есть следующие функции:

const modifyArr = R.curry((i, newValue, arr) => 
        Object.assign([], arr, {[i]: newValue})) 

Эта функция изменит значение Массив по заданному индексу.

Теперь я хочу использовать эту функцию дважды (с трубой), чтобы реализовать обмен между двумя элементами массива.

Я не могу понять, как его написать. Это то, что я получил:

const swap = (arr, a, b) => 
       R.pipe(modifyArr(b, arr[a], modifyArr(a, arr[b]))) 

Обратите внимание, что кэрри версия modifyArr (после получения двух аргументов) ожидает массив, но я передаю 3 аргумента в функции подкачки.

Как использовать трубку, где моя родительская функция получает разные аргументы, чем первая функция в трубе?

Спасибо.

+1

Вы не можете поменять так, значение в один индекс должен быть хранить в переменной первого или вы получите другое значение дважды! –

+0

@ibrahimmahrir На самом деле он должен работать, учитывая порядок оценки аргументов в JS, но это очень запутанно. – Bergi

ответ

2

Учитывая, что ваши функции кэрри, вы можете просто частично применить прежние аргументы, прежде чем делать трубы:

const swap = (arr, a, b) => R.pipe(modifyArr(a, arr[b]), modifyArr(b, arr[a]))(arr); 
+0

Ничего себе, так просто. Большое спасибо!! – Hasholef