
Vadim
29.04.2017
10:17:47
В консоли пишет ругань тогда

Aleh
29.04.2017
10:18:06
в смысле?)

Vadim
29.04.2017
10:18:28
Ошибку? Ща

Aleh
29.04.2017
10:18:35
const

Google

Vadim
29.04.2017
10:18:38
СОрри ))))
Спасибо!

Aleh
29.04.2017
10:18:55
тебе определенно надо перерыв сделать)

Vadim
29.04.2017
10:23:19
А в каких случаях этот chain может быть удобнее, например, pipe?
Задача-то одна и та же - создание цепочки операций для получения единого результата?

Aleh
29.04.2017
10:27:51
но абсолютно разный тип
попробуй через pipe сцепить head и append

Vadim
29.04.2017
10:30:25
Да, понадобится сохранение массива в отдельную переменную )
Спасибо! Поэкспериментирую

Aleh
29.04.2017
10:31:34
https://twitter.com/Crazy_Owl/status/676989458831556608
https://twitter.com/danslapman/status/813711498350567424

Vadim
29.04.2017
10:39:55
Я еще не очень пока освоился с описанием этих функциональных типов. Если читать описание к методу chain
Chain m => (a → m b) → m a → m b
То это означает что метод chain возвращает монаду, которая принимает каллбек, принимающий аргумент типа a, и возвращающий монаду, принимающую тип b в качестве аргумента? И потом эта "изначальная" монада, которую создает метод chain должна вернуть монаду, принимающую аргумент типа a, и та должна в свою очередь вернуть монаду, возвращающую монаду, принимающую тип b?
Как тогда под это определение ложится следующий пример из той же документации:
var duplicate = n => [n, n];
R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3]
?

Google

Vadim
29.04.2017
10:42:54
Ведь функция duplicate не возвращает никакую монаду?

andretshurotshka?❄️кде
29.04.2017
10:43:05

Vadim
29.04.2017
10:43:34
ок
Тогда еще непонятка с этим примером:
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
Где в документации типа указано что в качестве аргументов он может принимать произвольное число функций, возвращающих монады?

Aleh
29.04.2017
10:45:56

Vadim
29.04.2017
10:46:19
Это документация неполная, или я не понял как читать это определение метода chain?
Chain m => (a → m b) → m a → m b

Aleh
29.04.2017
10:46:57
Я еще не очень пока освоился с описанием этих функциональных типов. Если читать описание к методу chain
Chain m => (a → m b) → m a → m b
То это означает что метод chain возвращает монаду, которая принимает каллбек, принимающий аргумент типа a, и возвращающий монаду, принимающую тип b в качестве аргумента? И потом эта "изначальная" монада, которую создает метод chain должна вернуть монаду, принимающую аргумент типа a, и та должна в свою очередь вернуть монаду, возвращающую монаду, принимающую тип b?
не, метод chain принимает первым аргументом функцию, которая берет значение A и возвращает другое значение(B) в монаде, а вторым аргументом монаду со значением A
то, что до => можешь игнорировать
это ограничение на тип m

Vadim
29.04.2017
10:48:21
А третьим аргументом монаду со значением B?

Aleh
29.04.2017
10:48:28

Vadim
29.04.2017
10:48:29
И аргументов может быть только 3?

Aleh
29.04.2017
10:48:35
аргументов только два

Vadim
29.04.2017
10:48:38
Ок
Спасибо!
В этих описаниях типов m - это всегда монада?

Aleh
29.04.2017
10:49:57
чтобы понять, что такое m - надо смотреть запись до =>
m это что-то, что можно чейнить(т.е. монада)

Vadim
29.04.2017
10:50:39
Ух! Спасибо!

Google

Vadim
29.04.2017
10:50:57
Надо найти статью про описание этого синтаксиса описания типов )

Aleh
29.04.2017
10:51:04
может быть например Functor m, обычно конечно запишут Functor f, так принято
ну и в хаскеле оттуда

Vadim
29.04.2017
10:52:12
Но и для js как видно успешно используется
Интересно, есть ли название у этого синтаксиса?
Что б найти какую-нибудь короткую статью на этот счет

Aleh
29.04.2017
10:53:32
не знаю, посмотри определение функций хаскеля
займет час времени, но сразу поймешь записи

Roman
29.04.2017
11:07:28

Vadim
29.04.2017
11:08:12
Спасибо! Почитаю

Vladimir
29.04.2017
11:16:45
Нотация Хиндли-Мильнера

Aleh
29.04.2017
11:55:06
они классическую запись Гильберта юзали
или я путаю?

Vadim
29.04.2017
12:52:43
Тогда так же непонятно что именно можно пихать в chain, а что нет )

Aleh
29.04.2017
12:53:31
а что здесь противоречащего?)

Vadim
29.04.2017
12:53:39
А где видно что это монада?
Или ты имеешь в виду, что описание неполное?

Google

Aleh
29.04.2017
12:54:20
по объекту так не скажешь монада он или нет, важно как над объектом определен chain

Vadim
29.04.2017
12:54:50
Так, в итоге, исходя из чего я могу знать, какие методы можно пихать в чейн, а какие нет?

Aleh
29.04.2017
12:55:40
сек
для функций chain определен как return function(x) { return fn(monad(x))(x); };
т.е. функция A -> B является m B

Vadim
29.04.2017
12:56:47
Это значит что можно пихать любую ramda-функцию?

Aleh
29.04.2017
12:56:50
и тогда первым аргументом должна быть функция B -> m C
просто любую функцию

Vadim
29.04.2017
12:57:08
ок, интересно!

Aleh
29.04.2017
12:57:35
там важна связь пары fn и monad

Vadim
29.04.2017
12:58:00
почему-то об этом в документации библиотеки не сказано ничего :/

Aleh
29.04.2017
13:12:26
все в типе

Vadim
29.04.2017
13:13:05
В каком месте в типе говорится о том, что вторым аргументом может идти просто любая функция?
Chain m => (a → m b) → m a → m b

Aleh
29.04.2017
13:13:17
m a ж :)

Vadim
29.04.2017
13:14:00
Это же означает что это монада с типом а
А не просто любая функция

Aleh
29.04.2017
13:14:14
ну так все правильно
просто так совпало, что некоторые функции тож монады

Vadim
29.04.2017
13:14:56
Так head не монада, судя по его документации

Aleh
29.04.2017
13:15:27
тут такое замкнутое определение
монада это все, что можно чейнить

Google

Vadim
29.04.2017
13:15:52
А в документации head не видно что его можно чейнить

Aleh
29.04.2017
13:16:04
это функции, списки и то, что соответствует спеке fantasy-land

Maxim
29.04.2017
13:16:44
всем привет. Вероятно есть какой-то паттрн, или это не правильный путь
Maxim Shammasov, [29.04.17 16:12]
Maxim Shammasov, [29.04.17 16:10]
выбрать каррирование для селекта по криетриям или передавать объект критериев
Maxim Shammasov, [29.04.17 16:11]
в идеале конечно вижу что-то типа
Maxim Shammasov, [29.04.17 16:11]
select({prop1: 1, prop2:2}) == select({prop1:1})({prop2:2})
Maxim Shammasov, [29.04.17 16:11]
вероятно есть какой-то паттерн
Maxim Shammasov, [29.04.17 16:15]
эм... я юзаю typescript и у меня функция вроде select(pattern: {prop1?:string, prop2?:number})
Maxim Shammasov, [29.04.17 16:15]
с запоминанием названий полей проблем нет
Maxim Shammasov, [29.04.17 16:15]
просто хотелось бы вызвать частично применённую функцию, а иногда со всеми критериями

Vadim
29.04.2017
13:17:22

Aleh
29.04.2017
13:21:05
короч да, любая функция монада

Vadim
29.04.2017
13:21:16

Дмитрий
29.04.2017
13:22:53
Ща пример скину, там прям очевидно)

Vadim
29.04.2017
13:24:21
Ну я уже примерно представляю )
Как минимум преимущество в возможности прокидывания коллекции-аккумулятора через цепочку обработчиков

Дмитрий
29.04.2017
13:24:54
Ага

Maxim
29.04.2017
13:25:08
f({a:1, b:2, c:3}) === f({a:1})({b:2, c:3}})
есть ли такой паттерн ?
где вдохновиться, или это бред

Vadim
29.04.2017
13:25:56
curry
сорри ) нет )

Дмитрий
29.04.2017
13:26:25