
Aleh
29.04.2017
09:03:12
нет, Math.abs это не функция сравнения

Vadim
29.04.2017
09:03:54
А что же это?

Aleh
29.04.2017
09:03:55
uniqBy = uniq([-1, -5, 2, 10, 1, 2].map(a => Math.abs(a)))
Math.abs принимает один аргумент, а не два

Google

Aleh
29.04.2017
09:04:46

Vadim
29.04.2017
09:05:15
Вернее я имел в виду, что Math.abs тут используется для "настройки" операции сравнения

Aleh
29.04.2017
09:05:41
В uniqBy тоже передается функция для сравнения. И пример приведен в документации:
R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10]
для вот этого примера uniqWith выглядел бы вот так
uniqWith((a, b) => Math.abs(a) === Math.abs(b), [-1, -5, 2, 10, 1, 2])

Vadim
29.04.2017
09:08:01
Значит uniqWith предназначен для возможности более детального описания операции сравнения? Хотя в принципе, это же можно описать и в uniqBy :/
Выглядит так, что uniqWith не нужен
Какое-то излишество )

Aleh
29.04.2017
09:09:11
вместо или можно &&
попробуй такое в uniqBy сделать

Vadim
29.04.2017
09:10:01
Согласен. Спасибо!
Еще я что-то никак не догоняю насчет метода chain
Например, мне непонятно из документации почему следующий пример дает такой результат?
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
Что там происходит?

Google

Vadim
29.04.2017
09:28:23
Судя по документации, chain вообще должен принимать функцию как первый аргумент, и массив как второй.
А в этом (приведенном в документации же) примере все не так
В целом складывается ощущение что документация по ramda КРАЙНЕ неполная

Aleh
29.04.2017
09:29:32
не массив
любую монаду

Vadim
29.04.2017
09:29:56
Ну да, list
не монаду а лист

Aleh
29.04.2017
09:30:17
любую штуку с определенным chain
это монада
R.chain(R.append, R.head) R.head - монада

Vadim
29.04.2017
09:30:58
Ок, так каким аргументом тут передан лист?
R.chain(R.append, R.head)([1, 2, 3]);

Aleh
29.04.2017
09:31:05
никаким

Vadim
29.04.2017
09:31:14
вообще не врубаюсь )

Aleh
29.04.2017
09:31:28
тут список не в chain применяется, а к результату chain
const dummyAppender = R.chain(R.append, R.head)
dummyAppender([1, 2, 3])
в данном случае монада, которую сцепливают - R.head, а не список

Vadim
29.04.2017
09:33:11
в таком наборе аргументов dummyAppender это функция
А если сделать так: R.chain(duplicate, [1, 2, 3])
То вернется не функция, а сразу массив
А в документации это никак не объясняется

Aleh
29.04.2017
09:33:40
(a -> m b) -> m a -> m b
объясняется ж
никто не сказал, что m это Array, это любая монада

Google

Vadim
29.04.2017
09:34:26
Так в каком случае chain вернет сразу массив?
Если вторым аргументом идет массив?

Aleh
29.04.2017
09:34:42
когда первая функция возвращает массив

Vadim
29.04.2017
09:35:01
Вот это не говорится нигде

Aleh
29.04.2017
09:35:15
в описании типа ж :)
первым аргументом идет функция (a -> m b)
и результат всего chain это m b

Vadim
29.04.2017
09:35:49
Вот описан список принимаемых аргументов:
fn
The function to map with
list
The list to map over

Aleh
29.04.2017
09:35:51
т.е. если функция переданная первым аргументом вернет список, то и chain вернет список
смотри на типы

Vadim
29.04.2017
09:38:17
Ну ок. Так почему этот пример возвращает такой результат?
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
Можно пошагово?
Вот например R.head возвращает первый элемент массива. И к R.append уже передается этот первый элемент. Так откуда R.append знает об остальном массиве?

Aleh
29.04.2017
09:38:51
окей
append :: a → [a] → [a]
head :: [a] → a | Undefined
chain :: (a -> m b) -> m a -> m b
результат append в данном случае функция ([a] → [a])

Vadim
29.04.2017
09:40:45
То-есть, ничего не меняет
?

Aleh
29.04.2017
09:40:56
нет, приняла массив и вернула массив такого же типа

Vadim
29.04.2017
09:41:03
ок

Aleh
29.04.2017
09:41:35
тут даже проще, смотри
head :: [a] → a
append :: a → [a] → [a]
результат head и аргумент append можно соединить
chain их как бы и цепляет вместе

Google

Vadim
29.04.2017
09:44:01
Так chain как бы по очереди передает результат предыдущих функций каждой следующей?
Нет, проверил, тоже не получается
R.chain(x => x * 2, R.head)[1, 2, 3]; // undefined

Aleh
29.04.2017
09:45:08
вообще чес говоря не улавливаю куда теряется один аргумент)
попробовал в хаскелле
там не теряется

Vadim
29.04.2017
09:46:05
С документацией у ramda беда )

Aleh
29.04.2017
09:46:12
а стоп, че это я fmap юзанул
балда
да, в хаскеле тож так работает
ток аргументы в другом порядке

Vadim
29.04.2017
09:47:57
Я хаскеля не знаю, и мне этот криптоязык пока ничего не говорит )

Aleh
29.04.2017
09:48:19
>>= это chain с перевернутыми аргументами
короч ладно, я чет сам запутался и тебя сейчас запутаю

Vadim
29.04.2017
09:50:02
Я так и не понял, какие именно аргументы должна принимать первая функция в этом примере
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
Попробовал так
R.chain(function() {
console.log('arguments', arguments);
return arguments;
}, R.head)[1, 2, 3];
И вывелось undefined

Aleh
29.04.2017
09:52:43
Я так и не понял, какие именно аргументы должна принимать первая функция в этом примере
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
Попробовал так
R.chain(function() {
console.log('arguments', arguments);
return arguments;
}, R.head)[1, 2, 3];
И вывелось undefined
R.chain(a => l => [a, ...l], R.head)([1, 2])
в общем смотришь на результат выполнения первой функции при применении одного аргумента
это и будет результатом chain

Google

Aleh
29.04.2017
09:55:10

Vadim
29.04.2017
09:58:38
Попытался заменить append на другой метод:
R.chain(a => a, R.head)([1, 2, 3]);
И получил ругань в консоли: "t(...) is not a function"
Что в этом примере не так?
Что именно я не понял?

Aleh
29.04.2017
10:00:52
R.head это функция

Vadim
29.04.2017
10:01:02
Я ее и не трогал

Aleh
29.04.2017
10:01:02
поэтому сцепить ее можно только с чем-то, что вернет функцию
R.chain(a => _ => a, R.head)([1, 2, 3])

Vadim
29.04.2017
10:06:35
В документации по append сказано что вторым аргументом идет
"list
The list of elements to add a new item to. list."
Но даже если предположить что вторым аргументом должна придти монада, то такой вызов тоже не срабатывает:
R.chain((a, monad) => monad(), R.head)([1, 2, 3]);
В консоли я получаю "monad is not a function"
В чем ошибка?
Как нужно использовать второй аргумент?

pepsi ¯\_(ツ)_/¯
29.04.2017
10:09:04
А ты все фигню какую-то туда вставляешь

Vadim
29.04.2017
10:13:35
А ты все фигню какую-то туда вставляешь
Ок. Вот так работает:
R.chain((a) => a => a, R.head)([1, 2, 3]); //=> [1, 2, 3]
Но как мне в первой функции получить и использовать результат выполнения второй функции (в данном случае R.head)?

Aleh
29.04.2017
10:15:12
результат выполнения первой функции должен быть той же монадой, что ты передаешь вторым аргументом
если там функция, значит возвращать надо функцию
если список, то список

Vladimir
29.04.2017
10:16:05
Прочитай исходники чейна
Или доктора булеана посмотри на эггхеде