@frp_ru

Страница 49 из 420
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
uniqBy = uniq([-1, -5, 2, 10, 1, 2].map(a => Math.abs(a)))
не совсем так, потому что в итоге исходные элементы останутся

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

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

Выглядит так, что uniqWith не нужен

Какое-то излишество )

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
в общем смотришь на результат выполнения первой функции при применении одного аргумента

это и будет результатом chain

Google
Aleh
29.04.2017
09:55:10
R.chain(a => l => [a, ...l], R.head)([1, 2])
здесь результат - функция, которая принимает список и возвращает список

тут даже проще, смотри head :: [a] → a append :: a → [a] → [a] результат head и аргумент append можно соединить
вот здесь я все правильно говорил про сцепливание конца head с началом append

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"

В чем ошибка?

Как нужно использовать второй аргумент?

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
результат выполнения первой функции должен быть той же монадой, что ты передаешь вторым аргументом

если там функция, значит возвращать надо функцию

если список, то список

Страница 49 из 420