Андрей
я про связку с реактом
Taras 🦀
извращения))
Дима
@iamstarkov можешь посмотреть, я правильно понял суть фпшности? https://github.com/5angel/quak/tree/master/src
Как минимум, функции в функциональном стиле можно каррировать, получая от них производные const summ = e1=>e2=>e1+e2 const addThousand = summ(1000) let arr = [0,300,1000] console.log(arr.map(addThousand)) Поэтому желательно данные передавать в самом конце, тогда можно делать целые цепочки преобразований вообще не упоминая изменяемые объекты.
Дима
Плюс, функции обязаны быть чистыми для удобства отладки и прочего. Функции с document. внутри этому критерию не особо соответствуют
Дима
Модуль utils вообще не нужен, это стандартная функциональность ramda и lodash, повторять её смысла нет
Дима
По хорошему, твои функции должны выглядеть как-то так https://github.com/iamstarkov/split-keywords/blob/master/index.js
Nikolay
@ZeroBias @scalder27 @proDO спасибо-с)
Андрей
холиварный вопрос. Под новый проект ReactJS+Redux или Angular2+TS
Если по серьезному, то не зная специфики проекта, опыта и целей которых хочется добиться попутно, трудно что-то дельное советовать. Мне больше нравится реакт и я бы предпочел ReactJS+MobX+TS. Мне кажется что эта свзяка надежная, очень производительная, мне нравится как выглядит код и решение более зрелое чем Angular2.rcXX. Но есть определенные условия когда я бы выбрал Angular2.
Nikolay
а когда лучше зайдет ангуляр?
Nikolay
промто я бекбоновод
Nikolay
но чет устал
Grigory
Nikolay если ты бэкбоновод, то однозначно реакт. Переписывать с бэка на реакт — одно удовольствие, говорю по своему опыту
Serhii
Даров рибята
Vladislav
Нуу вообще не очень, если честно 😄
Собсно, я и пытаюсь научиться (:
Alex
Шо тут?
Vladislav
ща попробую проникнуться Старковым
Дима
а как же зиро дипенденси, не хочу рамды
Для фп это - зиро) Без неё многие вещи неудобно делать
Vlad
curry неправильная https://github.com/5angel/quak/blob/master/src/utils.js#L72-L74
православно примерно так https://iamstarkov.com/fp-js-workshop/01-theoretic-intro/#26 const curry = fn => (...args) => args.length < fn.length ? (...newArgs) => curry(fn)(...args.concat(newArgs)) : fn(...args)
Vladislav
Vlad
@iamstarkov можешь посмотреть, я правильно понял суть фпшности? https://github.com/5angel/quak/tree/master/src
each, лучше сразу каррировать и data last export each = curry( (cb, collection) => { for (const key in collection) { if (collection.hasOwnProperty(key)) { cb(collection[key], key) } } });
Ilya
Бррр, тернарник со сносами.
Дима
Бррр, тернарник со сносами.
Очень удобно, я сам к такому пришёл
Ilya
Есть ещё карри который вызывается на аргументы когда последний вызов не содержит аргументов.
Ilya
Типо, бесконечно аккумулирует.
Vladislav
в этом смысл карри, разве нет?
Я тут не слишком разбираюсь (: Значит, когда все аргументы есть, можно просто bind или как в таком случае поступать?
Ilya
Очень удобно, я сам к такому пришёл
Ну не знаю, однострочники норм, я защищал и защищаю их, а вот в несколько строчек... if {} else {} как-то очевидней на мой взгляд.
Ilya
Символьная магия разнесённая на несколько строчек.
Vlad
смысл карри в том, чтобы отложить вычисление функции пока она не получит все аргументы
Vlad
как только получила, запускай
Vlad
все хелперы — каррируй по умолчанию https://github.com/5angel/quak/blob/master/src/utils.js#L72-L74
Vlad
те, что из них чистые — мемоизируй
Дима
Ну не знаю, однострочники норм, я защищал и защищаю их, а вот в несколько строчек... if {} else {} как-то очевидней на мой взгляд.
If else, да ещё и со скобками, как мне кажется , это для выполнения нескольких процедур, а когда нужно просто одно из двух значений вернуть это визуальный шум
Ilya
А когда мне рассказывали, что карирование нужно, чтобы сохранить 1-arity у функций потому что это лучше поддаётся анализу или как-то так.
Vladislav
все функции писать через const – это тоже такой православный подход?
Vlad
эта чистая функция не будет вычислать второй раз результат для уже проработонного инпута
Vlad
для просчитанных инпутов функция становится хеш таблицей
Дима
Vlad
у меня почти нет переменных, поэтому функции в констах хранить норм
Vlad
define methods мутабельный =( https://github.com/5angel/quak/blob/master/src/utils.js#L62-L66
Vlad
безопаснее сделать shallow copy и вернуть её
Vlad
ещэ
Vlad
для дефолтного каррирования нужно, чтобы у функции было определённое арити
Vlad
то есть не ...rest
Vlad
и не function() { console.log(arguments) }
Vlad
а function(arg1, arg2, …, argN-1, argN)
Vlad
я бы для простоты тестирования разделил работу с домом/браузером и всё остальное
Vladislav
для дефолтного каррирования нужно, чтобы у функции было определённое арити
ну я заметил, что дефолтные аргументы оно тоже не любит
Vladislav
надо подумать
Vlad
дефолтные аргументы лучше делать через partial application
Vlad
const add = curry( (a, b) => a + b); const add1byDefault = add(1); const add100byDefault = add(100);
Vladislav
Я понял, в таком случае получается, что дефолтные аргументы в es2015-синтаксисе вообще не используются
Andrey
дефолтные аргументы о другом и для другого)
Vlad
очень многое не используется
Vlad
из плюсов код становится более языко-агностичным
Damir
из плюсов код становится более языко-агностичным
переведите пожалуйста этот термин на русский
hlomzik
плевать, на чем пишешь
Vlad
на сях используешь си фп-библиотеку
Vlad
код примерно такой же
Vlad
дефолтные аргументы о другом и для другого)
они о другом, но с частичным применением они не нужны, смотри: const map = curry( (fn, arr) => arr.map(fn)); const id = x => x; const mapIdByDefault = map(id) const double = x = x * 2; const mapDoubleByDefault = map(double) mapIdByDefault([1, 2]); // [1, 2] mapDoubleByDefault([1, 2]); // [2, 4]
Vlad
зачем тебе зашитое внутри поведение, если его можно пробрасывать снаружи и сохранять в отдельную функцию?
Andrey
да, но это чистое применение карринга и установления переменных с у же пред установленными значениями) но дефолтные значения чуть другое)
Andrey
const map = curry( (fn = x => x, arr) => arr.map(fn)); можно было и так написать и покрыть вариант с дефолтным вызовом)
Vladislav
те, что из них чистые — мемоизируй
Можешь показать пример правильной мемоизации?
Vlad
вот модуль https://github.com/iamstarkov/es-deps-from-string
Vlad
принимает строку возвращает массив
Vlad
при одинаковых строках результат будет всегда одинаковый
Vlad
для работы с фс я его мемоизировал https://github.com/iamstarkov/es-deps/blob/master/index.js#L9
Vladislav
https://github.com/ramda/ramda/blob/master/src/internal/_arity.js
Vladislav
wat
hlomzik
ENLARGE YOUR FUNCTION
hlomzik
я так понимаю, это для функций с неопреленной arity
hlomzik
или для ее увеличения, хотя это уже странно