@frp_ru

Страница 6 из 420
Ҫѐҏӗѫӑ
15.08.2016
17:55:58
superFunctionalCode();

вауля

FP во все поля

Алексей
15.08.2016
17:56:14
сравниваем :) const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } } function hell(value, ...args) { for (let arg of args) { if (!arg(value)) { return; } } } const something = getSomething('hell here'); hell(something, valueIsAllowed, doSomething);

Google
Filipp
15.08.2016
17:57:20
ну как минимум вместо итерации нужно args.some

и переименовать бы их в predicates

Ҫѐҏӗѫӑ
15.08.2016
17:57:56
Filipp
15.08.2016
17:58:10
ээ что

Ҫѐҏӗѫӑ
15.08.2016
17:58:10
потому что такую ф-ю не получится каррировать

а, ну ясно)

.some — уже не фп

Filipp
15.08.2016
17:59:16
а .reduce?

Ҫѐҏӗѫӑ
15.08.2016
17:59:30
js-овский редьюс тоже

в рамде и лодаше-фп — другое дело

Filipp
15.08.2016
18:01:00
ок, но в любом случае цикл это ещё менее функционально

Алексей
15.08.2016
18:01:28
Можно и рамбдой.. в общем пока по факту - императивщина выигрывает ( что печально ) const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } }

Ҫѐҏӗѫӑ
15.08.2016
18:02:06
на самом деле ответ выше был

Google
Алексей
15.08.2016
18:03:07
const condition = R.compose( R.when(getSomething(something)), R.when(valueIsAllowed) ) const action = R.compose(getSomething, doSomething) R.when(сondition, action)(something) Достойно - но лучше ли? не думаю :)

Ҫѐҏӗѫӑ
15.08.2016
18:03:28
тут надо понять что ты хочешь и делать частичное применение

а если надо просто решить задачу, то решать и не выебываться :)

Алексей
15.08.2016
18:03:57
В этих функциях даже return нет, сплошной побочный эффект
они чистые - у тебя есть 3 чистые функции getSomething, isSomethingAllowed, doSomething

Ҫѐҏӗѫӑ
15.08.2016
18:04:09
в том же лодаше-фп внутри все не совсем по фп и засчет этого он лучше рамды

Ярослав
15.08.2016
18:04:16
Ему не нужно ничего композировать и моё решение полностью повторяет его логику.

Алексей
15.08.2016
18:05:40
вот хороший пример их реализации на котором можно базироваться const getSomething = (x) => 'Something ' + x const doSomething = (s) => s.toUpperCase() const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false

Дмитрий
15.08.2016
18:06:05
они чистые - у тебя есть 3 чистые функции getSomething, isSomethingAllowed, doSomething
getSomething(...) Отличный код для функционального каррирования?? В общем, слишком абстрактный и неполный пример

Ҫѐҏӗѫӑ
15.08.2016
18:06:30
что такое функциональное каррирование? и как выглядит императивное?

Ярослав
15.08.2016
18:06:42
Хотите налёта функциональности - верните из hell функцию и уберите первый аргумент

Дмитрий
15.08.2016
18:08:54
Не отмазывайтесь а решите уже простую задачу :)
Тогда в ответ тоже попрошу решить простую задачку Для любого натурального числа n>2 уравнение a^n+b^n=c^n не имеет решений в целых ненулевых числах a,b,c

Алексей
15.08.2016
18:09:18
Задача - есть императивный код const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } } Сделайте это FP подходом не избавляясь от вызовов getSomething, valueIsAllowed, doSomething (функции чистые) В качестве премера можете использовать эти реализации функций const getSomething = (x) => 'Something ' + x const doSomething = (s) => s.toUpperCase() const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false PS: даю вам фору - можете использовать ЛЮБУЮ FP библиотеку

Ярослав
15.08.2016
18:11:22
Так и чем тебе мой ответ не подходит?

Google
Алексей
15.08.2016
18:11:50
Так и чем тебе мой ответ не подходит?
Ни размером ( он больше ) ни читабельностью ( функцию hell приходиться дешифровать )

Ярослав
15.08.2016
18:12:03
Он меньше

Алексей
15.08.2016
18:12:26
сравниваем :) const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } } function hell(value, ...args) { for (let arg of args) { if (!arg(value)) { return; } } } const something = getSomething('hell here'); hell(something, valueIsAllowed, doSomething);

Ярослав
15.08.2016
18:14:32
Я этого тролля дальше кормить не буду

Алексей
15.08.2016
18:20:25
if (something) в таком случае всегда истинно
даже чистая функция может вернуть результат который нам не нужно дальше обробатывать

бага тут нет

Дмитрий
15.08.2016
18:20:32
Ват?

Ҫѐҏӗѫӑ
15.08.2016
18:21:07
Алексей, открой уже для себя монаду Maybe ;)

Дмитрий
15.08.2016
18:21:52
бага тут нет
getSomething('') = 'Something ' if('Something ') всегда возвращает true

Ярослав
15.08.2016
18:22:37
У тебя жс не умеет так упрощать

Алексей
15.08.2016
18:23:15
Алексей, открой уже для себя монаду Maybe ;)
Да знаю я что такое Maybe. Меня удручает что никто не может показать как пример из 7 строчек кода напистаь на FP ( я сам не эксперт - но задача меня самого заинтересовала - сегодня вечером засяду ) const getSomething = (x) => 'Something ' + x это пример функции замени ее на const getSomething = (x) => x == ‘a’ ? ’Something ' + x : null

Ярослав
15.08.2016
18:23:33
А монады туда тоже коротким путём не прикрутишь

Алексей
15.08.2016
18:24:03
А монады туда тоже коротким путём не прикрутишь
вот да.. это и интересно :) ( покрайней мере меня лично задачка заинтересовала )

Надо на Rambda попробовать

Ҫѐҏӗѫӑ
15.08.2016
18:24:45
фп-вей не равно шорт-вей

тем более в таких примерах

Дмитрий
15.08.2016
18:24:57
Остановился уже переписывая суммарно)

Google
Дмитрий
15.08.2016
18:25:17
На "небаге"))

Опять херня

Бессмысленные какие-то примеры, изначально))

А, не, ок

const doSomething = (s) => s.toUpperCase() == R.toUpper const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false == const coolIndex = R.indexOf('cool') const gteZero = R.lte(0) const isAllow = R.pipe(coolIndex,gteZero) const getSomething = (x) => x == ‘a’ ? ’Something ' + x : null == const joinSome = R.concat('Something') const strictEq = R.ifElse(R.equals('a'),joinSome,()=>null) R.when(R.both(strictEq,isAllow),R.toUpper)

Надо на Rambda попробовать
const coolIndex = R.indexOf('cool') const gteZero = R.lte(0) const isAllow = R.pipe(coolIndex,gteZero) const joinSome = R.concat('Something') const strictEq = R.ifElse(R.equals('a'),joinSome,()=>null) R.when(R.both(strictEq,isAllow),R.pipe(strictEq,R.toUpper))

В первом посте - где к чему аналогия, во втором - мой код отдельно

Вопросы??

Filipp
15.08.2016
18:36:30
const conditionnaly = R.compose( R.when(Boolean), R.when(valueIsAllowed) ); const action = R.compose( conditionnaly(doSomething), getSomething ); console.log(action('cool')); console.log(action('ugly'));

о, с both даже лучше

Алексей
15.08.2016
18:39:29
const conditionnaly = R.both(Boolean, valueIsAllowed); R.compose(conditionnaly(doSomething), getSomething)(...) Во! ( надо только проверить работате ли этот код )

Filipp
15.08.2016
18:40:33
только R.when(R.both(...

Дмитрий
15.08.2016
18:49:13
const conditionnaly = R.both(Boolean, valueIsAllowed); R.compose(conditionnaly(doSomething), getSomething)(...) Во! ( надо только проверить работате ли этот код )
В развёрнутом виде всё равно получится как у меня R.when(R.both(strictEq,isAllow),R.pipe(strictEq,R.toUpper))

Алексей
15.08.2016
18:50:29
Почти http://goo.gl/S9yLBT const getSomething = (x) => x.indexOf('c') >= 0 ? 'Something ' + x : null const doSomething = (s) => s.toUpperCase() const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false const conditionnaly = R.when(R.both(Boolean, valueIsAllowed)) R.compose(conditionnaly(doSomething), getSomething)('c') почему-то valueIsAllowed проходит проверку хотя не должно :/

В развёрнутом виде всё равно получится как у меня R.when(R.both(strictEq,isAllow),R.pipe(strictEq,R.toUpper))
нужно как-раз не в развернутом. Понятно что в развернутом намного красивее - но задача изначально состоит в том чтобы всетаки воспользоваться именно функциями

Дмитрий
15.08.2016
18:51:52
Эээ, а у меня что?))

Не функции?)

Алексей
15.08.2016
18:54:32
Эээ, а у меня что?))
функции - только ты getSomething, doSomething, valueIsAllowed разбил на запчасти, а их трогать нельзя

Дмитрий
15.08.2016
18:56:00
функции - только ты getSomething, doSomething, valueIsAllowed разбил на запчасти, а их трогать нельзя
Реально разбита только getSomething, doSomething вообще заменяется стандартной переменной R, лол

Алексей
15.08.2016
18:57:18
Реально разбита только getSomething, doSomething вообще заменяется стандартной переменной R, лол
В этом и соль вся. Переписав функции можно очень красивый код получить, но в этом и проблема - не всегда это возможно ( целесообразно ).

Google
Дмитрий
15.08.2016
18:57:43
Там три строчки,в уме складываются даже, это издевательство что ли?))

const coolIndex = R.indexOf('cool') const gteZero = R.lte(0) const isAllow = R.pipe(coolIndex,gteZero) == const isAllow = R.pipe(R.indexOf('cool'),R.lte(0))

Критическая разница, конечно))

Алексей
15.08.2016
18:59:49
const coolIndex = R.indexOf('cool') const gteZero = R.lte(0) const isAllow = R.pipe(coolIndex,gteZero) == const isAllow = R.pipe(R.indexOf('cool'),R.lte(0))
а где тут вызовы getSomething, doSomething, valueIsAllowed ? ( еще раз от них избавляться нельзя - в этом вся сложность задачи )

Дмитрий
15.08.2016
19:00:03
Лол

Ну я же избавился

?

Алексей
15.08.2016
19:00:23
Ну я же избавился
избавился - но задачу не решил

Дмитрий
15.08.2016
19:00:28
Короче так - корректность задачи проверяется выходными тестами

Всё остальное - верчение ужа на сковородке

Алексей
15.08.2016
19:01:05
выходной тест проверяет что вызванно 3 функции из API getSomething, doSomething, valueIsAllowed

Дмитрий
15.08.2016
19:01:36
Так

Алексей
15.08.2016
19:01:40
ок напишу сегодня ( чуть попозже ) unit тесты

Дмитрий
15.08.2016
19:01:59
Нефиг менять условия на ходу, это уже прямо реально троллота толстая

Задача - есть императивный код const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } } Сделайте это FP подходом не избавляясь от вызовов getSomething, valueIsAllowed, doSomething (функции чистые) В качестве премера можете использовать эти реализации функций const getSomething = (x) => 'Something ' + x const doSomething = (s) => s.toUpperCase() const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false PS: даю вам фору - можете использовать ЛЮБУЮ FP библиотеку

Да знаю я что такое Maybe. Меня удручает что никто не может показать как пример из 7 строчек кода напистаь на FP ( я сам не эксперт - но задача меня самого заинтересовала - сегодня вечером засяду ) const getSomething = (x) => 'Something ' + x это пример функции замени ее на const getSomething = (x) => x == ‘a’ ? ’Something ' + x : null

Это чьё было?

Я по этому условию ВСЕ сделал

И юнит тест не нужно писать "сегодня", он очевидный и простой

И если для toUppercase нужен API, то извините

Алексей
15.08.2016
19:03:35
Сделайте это FP подходом не избавляясь от вызовов getSomething, valueIsAllowed, doSomething

Дмитрий
15.08.2016
19:04:15
Не зная входных данных, на тупо абстрактных функциях без свойств и характеристик. Функциональное. Ага

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