
Kelin
24.09.2017
23:54:17


Дмитрий
24.09.2017
23:54:40
Напоминаю
Кстати, рамда, судя по их кукбуку https://github.com/ramda/ramda/wiki/Cookbook пропагандирует строго "функциональный подход" на счет того что б не сохранять в константах промежуточные данные. Во всех примерах они оперируют ТОЛЬКО ФУНКЦИЯМИ. Это, на мой взгляд, уменьшает читабельность кода (хотя может я это говорю с непривычки). Есть ли преимущество у такого подхода?
Я полюбил рамду из-за возможностей разного рода пайпов/компосов и прочего. Но в своем коде я обычно по преждему использовал константы с промежуточными значениями. А есть ли преимущества от отказа от сохранения промежуточных значений, и манипулирования только лишь функциями?
Отказ от переменных ради отказа от переменных не нужен, если проще написать с ними — пиши, это ок) Стиль рамды позволяет абстрагироваться от конкретных объектов и описывать операции в общем виде, в универсальной и краткой форме

Google

Дмитрий
24.09.2017
23:54:40
Большую часть времени в обычном жс рамда выступает в качестве эффективного средства для функций - однострочников) Никаких упоротых «композ через композ», просто какие - то атомарные операции в три-четыре последовательных действия
Потом начинаешь замечать, что всё большая и большая часть задач оказывается атомарной да и вообще повторяется
А попытаться сразу писать point-free-everything — это прямой путь к fp fatigue, сколько раз уже наблюдал подобное ?
Смысл в эффективности, а не в point free
Это не видеть за деревьями леса

? animufag ?
24.09.2017
23:55:34

Дмитрий
24.09.2017
23:55:57

? animufag ?
24.09.2017
23:56:40
фп обычно не делают со ссылкамм на парентов и братьев/сестёр

Дмитрий
24.09.2017
23:56:45
Я сейчас читаю purescript by example как раз на стейтах и ридерах, там это нормально выглядит
Но здесь вам не там, очевидно

Kelin
24.09.2017
23:57:03
ну ля, мне не нравится писать трижды

Дмитрий
24.09.2017
23:57:07

Kelin
24.09.2017
23:57:08
шо за ебень

Google

Павел
24.09.2017
23:57:26
Добрый вечер всем. Подскажите пожалуйста, возможно ли в связке Sanctuary + Fluturejs сделать режект (Fluture.reject()) или ресолв (Fluture.of()) из Sanctuary, например, из Either?

Дмитрий
24.09.2017
23:57:46
Не оч понимаю формулировку ??

Kelin
24.09.2017
23:57:50
ебать

Дмитрий
24.09.2017
23:57:59
Точнее, в чём проблема

Павел
24.09.2017
23:58:11
Future.of('')
.chain(
S.either(
Future.reject,
Future.of
)
)
Кинет ошибку

? animufag ?
24.09.2017
23:58:19

Kelin
24.09.2017
23:58:34

Дмитрий
24.09.2017
23:59:06
кинь ссылку
https://leanpub.com/purescript/read
Мне на самом деле прям уже ппц как припёрло и нужно запутанную часть кода переписать на purescript, поэтому пытаюсь въехать волей неволей
someFuture // Future[ Reject, Resolve ]
someFuture.fold(Left, Right) // Future [ void, Either [ Reject, Resolve ] ]

Kelin
25.09.2017
00:01:12
как у вас в голове столько структур держится

Дмитрий
25.09.2017
00:01:15
То есть фолд упакует твои значения в resolve поле

Kelin
25.09.2017
00:01:19
в читабельном состоянии

kana
25.09.2017
00:01:27
Не, ему нужно наоборот
Either a b -> Either (Future a c) (Future d b)

Kelin
25.09.2017
00:01:31

Дмитрий
25.09.2017
00:01:45

Kelin
25.09.2017
00:01:52
да это понятно

kana
25.09.2017
00:01:57
Там either как надо работает, но какой-то санкторный чекер говорит, что неь типа для флутуры

Дмитрий
25.09.2017
00:02:03
Ааа

Google

Дмитрий
25.09.2017
00:02:24
Ну sanctuary говнина та ещё, я извиняюсь за свой французский
Рантайм-типизация — ну такое

Павел
25.09.2017
00:03:32
Хм
Чем он плох?

Дмитрий
25.09.2017
00:03:43
Бтв, её можно отключить https://gist.github.com/zerobias/f42247222ffbbabbe8591df807bc0a12

Павел
25.09.2017
00:04:28
Расширенная версия рамды, монадки

Дмитрий
25.09.2017
00:04:51
Я написал свой either, который вносит фактически близкий к абсолютному нулю оверхед (быстрее чем у folktale)
Он пользуется статической типизацией флоу, так как то проще
Видеть что у тебя получается не по дебаггеру а прямо в подсказках ide

kana
25.09.2017
00:05:52
Че лично мне не понравилось, дык это "fantasy-land/chain" вместо "chain". Было бы лучше, если бы было два варианта, сделать несложно же

Дмитрий
25.09.2017
00:06:17

Дмитрий
25.09.2017
00:06:43
Так как все сошлись на том, что юзерские map и chain авторы могут захотеть имплементировать по своему
У fluture такой ap например
"не по канону"
Но интероп сохраняется, потому что либы общаются через fantasy-land/ap

Kelin
25.09.2017
00:07:54
я придумал

Дмитрий
25.09.2017
00:08:21
Но как бы там ни было, у меня есть идея получше, чем просто длинный метод. Правда не уверен, кто его поддержит, но для себя я такое сделал)

Kelin
25.09.2017
00:08:29

Дмитрий
25.09.2017
00:09:35

Google

? animufag ?
25.09.2017
00:12:29
вроде initServices у тебя принимала один аргумент
а updateWith 4

Kelin
25.09.2017
00:12:57
неееееет
щас все будет
посоны

Дмитрий
25.09.2017
00:50:57
Побочный эффект от чтения purescript by example: когда автор начинает соединять монады Reader, State и Writer в новую, более мощную монаду RWS и приделывает к ней монадический трансформер RWST, то хочется кричать ?

? animufag ?
25.09.2017
01:03:13
initServices = flow(flip(apply), map, [flip(updateServices), mapInitService], flow)

Admin
ERROR: S client not available

? animufag ?
25.09.2017
01:04:01
тип он покрывает и ридер и врайтер

Kelin
25.09.2017
01:04:06

? animufag ?
25.09.2017
01:04:23
не думаю что я без ошибок написал

Kelin
25.09.2017
01:04:38
Зачем так усложнять

? animufag ?
25.09.2017
01:04:48
ПОЙНТФРИ

Kelin
25.09.2017
01:04:49
Нечитаемо же нихрена

? animufag ?
25.09.2017
01:04:59
ради него же сражаемся

Дмитрий
25.09.2017
01:05:07
я думмал стейта достаточно
Не, там крутая идея, мне по ходу именно это и нужно было
The first type parameter, r, represents the global configuration type. The second, w, represents the monoid which we will use to accumulate a log, and the third, s is the type of our mutable state

? animufag ?
25.09.2017
01:05:18
я заранее оговорился что тут ебанина какая-то

Kelin
25.09.2017
01:05:18
Ради нормального, а не упоротого

Google

Дмитрий
25.09.2017
01:05:23
О, нащёт флоу через флоу у меня кулстори есть ?

? animufag ?
25.09.2017
01:05:30
и после этого уже можно ебашить

Дмитрий
25.09.2017
01:07:15
В общем когда я только открыл для себя рамду я сразу по этой теме люто угорел, и переломной точкой было написание кода, смысл которого я перестал понимать примерно через два часа после его написания
https://github.com/zerobias/speak-r/blob/master/app/core/splitter.js#L34
Зацените
P — это пайп, который может принимать массивы
Я по прежнему не понимаю что тут происходит но кажется это пайпы, которые генерируют другие пайпы, которые генерируют другие пайпы


? animufag ?
25.09.2017
01:10:43
initServices = flow(flip(apply), map, [flip(updateServices), mapInitService], flow)
поясню
1) получаем на входе service и кидаем его на второй аргумент у Function.apply
2) получаем на входе ($ service) и кидаем его в мап
3) получаем map($ service) и кидаем ему аргументы две функции которые принимают сервайс первым аргументом
updateServices = update('services') и она первым аргументом принимает функцию так что флипаем её flip(update('services')) чтобы в неё закинуть service
4) промапав получаем список [services -> service, service] осталось их применить и видимо flow c этим справится (хотя тут сомневаюсь)

Kelin
25.09.2017
01:11:00

Дмитрий
25.09.2017
01:11:05
??

? animufag ?
25.09.2017
01:11:28
лол

Дмитрий
25.09.2017
01:11:34
Да, вот это в тот момент я ощутил отчётливо ?

? animufag ?
25.09.2017
01:11:52
не тут рили челы в джс немного как-то поехали на поинтфри
есть ещё много направления для саморазвития

Дмитрий
25.09.2017
01:12:32
Просто доки рамды акцентируют на этом внимание, а на остальных аспектах — нет

? animufag ?
25.09.2017
01:12:50
а поинтфри это как бы небольшая рекомендация на случай если у тебя скопилось несколько одноместныхх функций

Kelin
25.09.2017
01:13:04
Так ладно
Я вас покидаю

Дмитрий
25.09.2017
01:13:20
А, ну впоне может быть

Kelin
25.09.2017
01:13:33
Уж время позднее
Настолько позднее, что уже раннее