
Denis
10.07.2017
15:32:25
я кстати тут объяснял про filterM?

Ilya
10.07.2017
15:32:34
Я вроде не помню.

Denis
10.07.2017
15:32:48
а
это было в ramda чатике

Google

Denis
10.07.2017
15:35:11
начало тут https://gitter.im/ramda/ramda?at=58efc612ad849bcf427fd695
будут вопросы - задавайте

Vadim
10.07.2017
16:20:20
@Misaka, если ты хочешь разобраться в методе lift, то я тебе объясню его так, как объяснил самому себе )
Он принимает функцию-обработчик с произвольным набором аргументов, и возвращает функцию, принимающую такое же число "контейнеров значений", как и число аргументов у фукнции обработчика. Далее эта функция возвращает значение в том же типе контейнера, что и получила.
Пример:
У нас есть монада Maybe.Just(5). Это контейнер значения 5
Выполняем
lift(add)(Maybe.Just(5), Maybe.Just(2)); // => Maybe.Just(7)
Видишь? Произошло просто сложение чисел 5 и 2, и вернулся результат в виде 7. Только вернулся он обернутый в контейнер того же типа, как и был получен.
Это же произойдет и если в роли контейнеров мы используем массивы
lift(add)([5], [2]); // [7]

Ilya
10.07.2017
16:20:47
Ага.
Спасибо.
Т.е. он под мою задачу не подходит, но выглядит интересно, запомню.
Спасибо ещё раз.

Vadim
10.07.2017
16:21:24
Сейчас расскажу как это использовать с функциями )
Оно подходит под твою задачу )
Сейчас продолжу

Denis
10.07.2017
16:22:07
это из сигнатуры можно прочитать

Ilya
10.07.2017
16:22:26
Да, сигнатуры неплохо было бы научиться читать.

Vadim
10.07.2017
16:22:33
Насчет работы с функциями новичку будет вообще неочевидно поначалу

Denis
10.07.2017
16:22:35
lift(generalFn)(f1,f2,f3)(10)

Google

Denis
10.07.2017
16:23:01
это есть generalFn(f1(10), f2(10), f3(10))


Vadim
10.07.2017
16:24:26
Надо дополнить что некоторые операции над списками выглядят немного непривычно. Вот например сложение списков, если какой-то имеет некоторую длину (это и в официальном примере есть, но со строками это понятнее)
const adder = (a, b) => a + b
lift(adder)('ab', 'c'); // => ["ac", "bc"]
@Misaka Теперь насчет фукнций. Функцию тоже можно рассматривать как контейнер значения. Только что б получить это значение функцию нужно вызвать.
const plusOne = x => x + 1;
plusOne(1) // Тут я получаю значение из нашего контейнера, которое у нас будет 2
Теперь следи за руками )
const plusOne = x => x + 1;
const plusTwo = x => x + 2;
lift(add)(plusOne, plusTwo)(1) // => 5
Это подходит под твою задачу )
Что тут произошло?
Как я уже сказал, lift возвращает всегда контейнер того же типа, как и получил. Он получил две функции, и вернул соответственно тоже функцию, в которую мы и передали число 1
Далее обработчик (в нашем случае add) "получает значения" из пары переданных ему "контейнеров" в виде функций
И обрабатывает результат как ему нравится


Ilya
10.07.2017
16:32:53
Моя задача в чём, я её опишу как есть.
У меня есть инпут. У инпута есть только один onChange, собственна, туда он передаёт текущее значение в инпуте, это очевидно наверное не надо объяснять дальше.
Задача состоит в том, чтобы к одному и тому же значению этого инпута вместо одного обработчика применить два, при этом они не должны чейнится и возвращать ничего не должны.
Я возможно туплю, но вроде понимаю что ты написал и не понимаю каким образом это подходит под этот кейс.
Обычно для этого просто пишу ещё одну функцию которая внутри себя вызывает нужные мне, но если либа может так сразу, предпочёл бы не писать лишние символы.

Admin
ERROR: S client not available

Ilya
10.07.2017
16:35:08
Если говорить теоретически.
const plusOne = x + 1;
const plusTwo = x + 2;
tee(plusOne, plusTwo)(5) // => [6, 7];

Vadim
10.07.2017
16:35:55
Понял. Ну так можно нужные операции с сайд-эффектами прописать в этих самых переданных в моем случае plusOne и plusTwo.
Вообще на этот счет в рамде куча методов которые можно прикрутить под твой кейс

Ilya
10.07.2017
16:35:56
Скорее всего это всё таки useWith.

Vadim
10.07.2017
16:36:11
Еще juxt

Denis
10.07.2017
16:36:30
...

Ilya
10.07.2017
16:37:04
Ну неофит я, ну что поделаешь.
Все наверное когда-то и были на моём месте.

Vadim
10.07.2017
16:38:06
Я сам еще неофит в рамде и функциональщине, если что. Потому и объясняю так как понял сам. Может через годик тоже уже потеряю способность говорить на понятном языке )
И буду изъясняться как @xgrommx )
Еще для твоего кейса подходит sequence, но это уже изврат и излишество )
sequence(always, [plusOne, plusTwo, plusThree])(1) // => [2, 3, 4]

Denis
10.07.2017
16:51:55
тот же лифт