@frp_ru

Страница 5 из 420
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
R.compose(R.when(valueIsAllowed, doSomething), getSomething)('cool')
не совсем соответствует тому что написанно выше - но идея понятна конечно…

Alex
15.08.2016
16:10:17
да это просто для понимания идеи

http://ramdajs.com/repl/

вот можно поиграться

такой код намного более надежен

когда пишешь иногда удивляешься, что он работает

причем правильно часто с первого раза

а в приведенном примере, вроде все понятно, а начинают возникать какие-то баги за-за деталей, граничных случаев

Алексей
15.08.2016
16:23:14
вот можно поиграться
крокадил не ловиться - не растет какос http://goo.gl/6oepxU

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
const getSomething = (x) => 'Something ' + x const doSomething = (s) => s.toUpperCase() const valueIsAllowed = (x) => x.indexOf('cool') >= 0 ? true : false
сори я думал он просто выкидывает результат по типу https://www.typescriptlang.org/play/index.html хотя тепреь понимаю что это глупо :)

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
const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } }
const condition = R.compose( R.when(getSomething(something)), R.when(valueIsAllowed) ) const action = R.compose(getSomething, doSomething) R.when(сondition, action)(something) const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } } Мне сложно найти различия ( не помите неправильно - за FP и вообще мечтаю с Rambda поработать - но не всегда FP локаничнее и понятнее )

Alex
15.08.2016
16:53:20
это по-началу

по-началу оно сложнее и непонятнее разумеется

это нормально

Alex
15.08.2016
16:54:41
ну это вы напридумывали что-то

можно все нормально сделать

from
15.08.2016
16:55:17
R.compose(R.when(valueIsAllowed, doSomething), getSomething)('cool')
здесь вроде как один раз :)

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
ну вот это его фраза что кто не программирует функционально скоро будет лежать под мостом с бутылкой и стонать: почему я не учил функциональное программирование!
в каждой шутке есть доля шутки :) В общем о чем я - когда говорят что FP это красиво и лаконично - я не могу согласиться. Да его надо знать, да “иногда” код на нем намного элегентнее и проще писать, но в остальных случаях все точно так-же и по обьему и по сложности

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

покурите доку

Алексей
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
обычно так функции определяются - что-то на вход - что-то на выход
в этом проблема в примере есть сторонне API, getSomething, valueIsAllowed - тут не получиться просто дать что-то на вход и получить на выходе - нужно использовать API

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
Так ты читай последние две строчки
не не не - все кроме имплементации трех методов valueIsAllowed, doSomething, getSomething - в студию

Ярослав
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
Вся твоя сложная логика в функции hell
я ее не могу с первого раза прочитать..

Ҫѐҏӗѫӑ
15.08.2016
17:55:20
если бы задача была скрыть императивный код в функцию враппер, то можно было бы просто все в функцию завернуть

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