from
15.08.2016
15:45:55
так на чем сошлись? функциональное программирование обсуждаем?
как "по-нормальному" ? (функционально) записать вот такой conditional hell:
const something = getSomething(...);
if (something) {
const somethingIsAllowed = valueIsAllowed(something);
if (somethingIsAllowed) {
doSomething(something);
}
}
Ярослав
15.08.2016
16:05:21
тебе желательно указать, что будет в ветвях else, тогда будет записать значительно проще
Google
from
15.08.2016
16:07:17
а в else везде как бы ничего
Алексей
15.08.2016
16:07:33
Alex
15.08.2016
16:08:22
R.compose(R.when(valueIsAllowed, doSomething), getSomething)('cool')
Алексей
15.08.2016
16:09:28
Alex
15.08.2016
16:10:17
да это просто для понимания идеи
http://ramdajs.com/repl/
вот можно поиграться
такой код намного более надежен
когда пишешь иногда удивляешься, что он работает
причем правильно часто с первого раза
а в приведенном примере, вроде все понятно, а начинают возникать какие-то баги за-за деталей, граничных случаев
Алексей
15.08.2016
16:23:14
Google
Alex
15.08.2016
16:23:56
const getSomething = (x) => 'Something ' + x
const doSomething = (s) => s.toUpperCase()
const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false
ну хоть добавь функций каких-нибудь
Алексей
15.08.2016
16:27:09
Alex
15.08.2016
16:28:35
думаю, никто не будет спорить, что такая форма записи ветвлений, значительно чище и красивше
так вот в частности cycle делает возможным подобное при работе с динамическими данными через потоки
Алексей
15.08.2016
16:36:22
const getSomething = (x) => 'Something ' + x
const doSomething = (s) => s.toUpperCase()
const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false
let something = 'cool';
R.when(R.compose(
R.when(getSomething(something)),
R.when(valueIsAllowed)
), R.compose(
getSomething,
doSomething
))(something)
http://goo.gl/gG3GFr
Невижу элегантности в упор :)
Alex
15.08.2016
16:41:28
ну во-перых вы можете композировать как угодно функции, выделять и обзывать
и преобразовать например в такое
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
16:52:17
Alex
15.08.2016
16:53:20
это по-началу
по-началу оно сложнее и непонятнее разумеется
это нормально
from
15.08.2016
16:53:55
Алексей
15.08.2016
16:54:08
Alex
15.08.2016
16:54:41
ну это вы напридумывали что-то
можно все нормально сделать
from
15.08.2016
16:55:17
Alex
15.08.2016
16:55:24
вообще, я за советскую власть не агитирую) не нравится - пишите как умеете
Google
Алексей
15.08.2016
16:58:23
здесь вроде как один раз :)
не работает это выражение правильно
const getSomething = (x) => 'Something ' + x
const doSomething = (s) => s.toUpperCase()
const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false
let something = 'SHOULD FAIL!';
R.compose(R.when(valueIsAllowed, doSomething), getSomething)(something) // "Something SHOULD FAIL!"
from
15.08.2016
17:00:50
да :/
Alex
15.08.2016
17:01:27
а что должно быть то?) я вообще просто идею показал, как это делается
комозируются функции
https://youtu.be/FvMuPtuvP5w?t=134
Алексей
15.08.2016
17:02:33
Так я вот и показал что если этот же код в FP форме с рамдой записать - не получаеться ни лаконичности ни элегантности.. понятно что код не очень - но это FP не помогает
Alex
15.08.2016
17:03:12
помогает тому, кто знает)
Алексей
15.08.2016
17:03:23
Я Erik Meijer смотрю с 2005 года :)
Давайте в останемся в рамках конкрентного примера.
Alex
15.08.2016
17:04:21
ну вот это его фраза что кто не программирует функционально скоро будет лежать под мостом с бутылкой и стонать: почему я не учил функциональное программирование!
он большой шутник)
Алексей
15.08.2016
17:08:21
Alex
15.08.2016
17:09:03
он надежнее
а кода больше иногда
from
15.08.2016
17:09:30
пока что я вижу, что нефункциональный код получился понятнее
Но мне кажется, что как-то всё-таки можно записать функционально так, чтобы было....ещё понятнее ))
Alex
15.08.2016
17:09:35
1+2*3 vs add(1,mult(2,3)) - показатлельный пример
Попробуйте на haskell )
может понятнее будет
еще более понятнее
from
15.08.2016
17:10:33
он надежнее
ну ты так защищаешься, будто мы говорим "смотри, не получилось легко записать, поэтому не надо использовать FP"
мы так не говорим )
Alex
15.08.2016
17:11:44
я не защищаюсь, просто всегда это находит непонимание по-началу
Google
Alex
15.08.2016
17:11:53
но у меня интуитивно было наоборот
потому что меня уже бесил этот императивный код
from
15.08.2016
17:12:04
ну, гм
Alex
15.08.2016
17:12:16
с условиями циклами и всякими setTimeout
from
15.08.2016
17:12:17
I want to believe
но пока что хрень какая-то с этим примером :)
Alex
15.08.2016
17:12:38
какая хрень?
http://ramdajs.com/docs/#when
покурите доку
from
15.08.2016
17:12:57
Алексей
15.08.2016
17:14:08
покурите доку
пфф - покурите доку по ООП.
Есть конкретный пример который разоблачает FP
const condition = R.compose(
R.when(getSomething(something)),
R.when(valueIsAllowed)
)
const action = R.compose(getSomething, doSomething)
R.when(сondition, action)(something)
Alex
15.08.2016
17:14:11
хотя я так и не понял, чего вы хотите в своем примере и что вас не устраивает, ну добавить еще какие-то ветвления надо, может ifElse
таки разоблачитель)
Алексей
15.08.2016
17:16:00
Задача простая - есть код
const something = getSomething(...);
if (something) {
const somethingIsAllowed = valueIsAllowed(something);
if (somethingIsAllowed) {
doSomething(something);
}
}
нужно написать на FP его проще и лаконичнее - пока не получаеться - в этом и суть холивара
Alex
15.08.2016
17:16:19
входные и выходные данные напишите для теста
обычно так функции определяются - что-то на вход - что-то на выход
Алексей
15.08.2016
17:20:00
Alex
15.08.2016
17:20:00
вы пишите, я отойду и напишу если сами не решите)
Алексей
15.08.2016
17:20:11
Alex
15.08.2016
17:20:30
ценю)
Google
Ярослав
15.08.2016
17:34:26
ваш пример, конечно, странный, но и под него функция найдётся
function getSomething(input) {
return input;
}
function valueIsAllowed(val) {
return val.length > 5;
}
function doSomething(val) {
alert(val);
}
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
17:45:19
это плохой пример фп кода
если что
Ярослав
15.08.2016
17:46:00
Ну да
Зато решает задачу
Ҫѐҏӗѫӑ
15.08.2016
17:48:58
вроде как задача была написать неимперативно, но читаемо
Ярослав
15.08.2016
17:49:24
Так ты читай последние две строчки
Ҫѐҏӗѫӑ
15.08.2016
17:49:30
лол
Алексей
15.08.2016
17:51:56
Ярослав
15.08.2016
17:52:30
Они уже написаны выше
Алексей
15.08.2016
17:54:28
Ярослав
15.08.2016
17:54:31
Вся твоя сложная логика в функции hell
Алексей
15.08.2016
17:54:48
Ҫѐҏӗѫӑ
15.08.2016
17:55:20
если бы задача была скрыть императивный код в функцию враппер, то можно было бы просто все в функцию завернуть