
Ҫѐҏӗѫӑ
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:02:46
и будет ок

Алексей
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:17
Какой уж тут фп)

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

Алексей
15.08.2016
18:03:57

Ҫѐҏӗѫӑ
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

Filipp
15.08.2016
18:05:46

Дмитрий
15.08.2016
18:06:05

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

Алексей
15.08.2016
18:06:36

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

Дмитрий
15.08.2016
18:08:54

Алексей
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

Ярослав
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:19:27
В функциональном стиле баг сразу видно, кстати ;)

Алексей
15.08.2016
18:20:25
бага тут нет

Дмитрий
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

Алексей
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 проходит проверку хотя не должно :/

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

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

Дмитрий
15.08.2016
18:56:00

Алексей
15.08.2016
18:57:18

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

Дмитрий
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
Не зная входных данных, на тупо абстрактных функциях без свойств и характеристик. Функциональное. Ага