@frp_ru

Страница 7 из 420
Алексей
15.08.2016
19:06:18
Не зная входных данных, на тупо абстрактных функциях без свойств и характеристик. Функциональное. Ага
Функции чистые ( из условия ) не вижу никаких проблем и чему они противоречат

FP не означает каждый раз писать велосипед

Дмитрий
15.08.2016
19:07:10
На ходу переобувая шины ;)

from
15.08.2016
19:11:24
Хочу чуть-чуть уточнить применение Может я не очень понятными примеры делаю, если что уточняйте) Но идея такая const REFERENCE_TYPES = ['one', 'two']; function getSomething(x) { /* some complex condition */ return x.length > 5 ? 'two' ? ''; } const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(REFERENCE_TYPES, something); if (somethingIsAllowed) { doSomething(something); } } здесь надо обратить внимание, что "something" не единственный аргумент функции valueIsAllowed

Google
from
15.08.2016
19:14:14
может для кого-то это прояснит что-то)

Алексей
15.08.2016
19:18:14
> @everdimension здесь надо обратить внимание, что "something" не единственный аргумент функции valueIsAllowed Блин не усложняй пока - надо с 1 аргументом решить :) а там уже ясно будет что делать со вторым

Алексей
15.08.2016
19:19:21
Дмитрий
15.08.2016
19:19:39
вариант - но getSomething 2 раза вызывается
Все претензии к авторам API

from
15.08.2016
19:20:06
ну просто в императивном js это вообще можно ещё упростить, написав if (something && somethingIsAllowed(REFERENCE_TYPES, something)) {...}, пожертвовав лишь тем, что строчка длинная получается))

Алексей
15.08.2016
19:20:34
Все претензии к авторам API
Вот вариант без 2х вызовов 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 у него не срабатывате проверка ( пока не понимаю почему )

from
15.08.2016
19:20:42
Все претензии к авторам API
в смысле? императивно-то проблем нет

Дмитрий
15.08.2016
19:21:11
в смысле? императивно-то проблем нет
У меня и функционально проблем нет, проблема только в чутка поехавших условиях

from
15.08.2016
19:21:24
а, хотя то что два аргумента в valueIsAllowed это действительно вообще не проблема каррируем и всё

from
15.08.2016
19:22:07
почему?

Google
Алексей
15.08.2016
19:22:33
Потому что это мой же пример, но с багом
Вот как твой-же пример поченить? подскажи :)

Дмитрий
15.08.2016
19:23:45
Вот как твой-же пример поченить? подскажи :)
Мой пример рабочий)) Кстати, раз уж теперь тут катит ответ в две строки, то пожалуй, я сначала вызову R.once(getSomething) ??

Алексей
15.08.2016
19:26:20
> @ZeroBias R.once(getSomething) ?? выкрутился :) но всеже - хочу добить const conditionnaly = R.when(R.both(Boolean, valueIsAllowed)) R.compose(conditionnaly(doSomething), getSomething)('c')

https://jsfiddle.net/dpntwxa7/

Дмитрий
15.08.2016
19:33:57
> @ZeroBias R.once(getSomething) ?? выкрутился :) но всеже - хочу добить const conditionnaly = R.when(R.both(Boolean, valueIsAllowed)) R.compose(conditionnaly(doSomething), getSomething)('c')
Я не понимаю, что значит R.both(Boolean), это бессмыслица какая-то. На месте Boolean стоит второй вызов getSomething

Алексей
15.08.2016
19:34:52
Boolean это замена проверки - if (something) {

Дмитрий
15.08.2016
19:36:09
Ну вот она и не работает))

Boolean это замена проверки - if (something) {
const onceSomething = R.once(getSomething) const execute = R.when(R.both(onceSomething,valueIsAllowed),R.pipe(onceSomething,doSomething)) Мой вариант отличается только наличием pipe вместо compose

http://ramdajs.com/repl/#?code=const%20getSomething%20%3D%20%28x%29%20%3D%3E%20x.indexOf%28%27c%27%29%20%3E%3D%200%20%3F%20%27Something%20%27%20%2B%20x%20%3A%20null%0Aconst%20doSomething%20%3D%20%28s%29%20%3D%3E%20s.toUpperCase%28%29%0Aconst%20valueIsAllowed%20%3D%20%28x%29%20%3D%3E%20x.indexOf%28%27cool%27%29%20%3E%3D%200%0A%0Alet%20process%20%3D%20function%28obj%29%20%7B%0A%20%20const%20onceSomething%20%3D%20R.once%28getSomething%29%0A%20%20const%20execute%20%3D%20R.when%28R.both%28onceSomething%2CvalueIsAllowed%29%2CR.pipe%28onceSomething%2CdoSomething%29%29%0A%20%20return%20execute%28obj%29%0A%7D%0Alet%20pr1%20%3D%20process%28%27cool%27%29%0Alet%20pr2%20%3D%20process%28%27cool2%27%29%0Alet%20_test%20%3D%20pr1%3D%3D%27SOMETHING%20COOL%27%26%26pr2%3D%3D%3D%27SOMETHING%20COOL2%27%0A%20%20%3F%20%27true%27%0A%20%20%3A%20%27false%27%0A_test%0A

Алексей
15.08.2016
19:46:19
'Something c' не содержит подстроки 'cool', вот он и не апперкейсит
Он вообще не долен ничего вернуть если cool нет const something = getSomething(...); if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } }

Filipp
15.08.2016
19:46:39
тогда тебе нужен не when

Дмитрий
15.08.2016
19:46:49
И кстати, это и есть главный источник ошибок

Привет, undefined is not a function))

Filipp
15.08.2016
19:48:29
ну вообще doSomething() в таком коде это сайд-эффект конечно

Алексей
15.08.2016
19:49:26
ну вообще doSomething() в таком коде это сайд-эффект конечно
функции чистые ( не придерайтесь к названиям ) нет в ней сайд эффекта

Filipp
15.08.2016
19:49:37
тогда это no-op

Google
Алексей
15.08.2016
19:49:43
переименуйте на returnSomething()

Filipp
15.08.2016
19:49:58
ты вызываешь функцию и ничего не делаешь с результатом

Алексей
15.08.2016
19:49:58
тогда это no-op
она ожидает аргумент и выдает результат

Дмитрий
15.08.2016
19:50:28
Тогда мы не ожидаем никакого возврата из функции

И неважно, что она там возвращает))

Алексей
15.08.2016
19:51:47
Filipp
15.08.2016
19:52:40
потому что в коде просто вызывается doSomething() и возвращаемое значение уходит вникуда

Дмитрий
15.08.2016
19:53:52
почему не ожидаем?
if (something) { const somethingIsAllowed = valueIsAllowed(something); if (somethingIsAllowed) { doSomething(something); } } В этом коде нет return, значит нет объектов, которые бы обрабатывали возврат из этой функции, значит можно возвращать что угодно и на работе программы это не скажется. Задача - вызвать сайд-эффект при определенных условиях, ну вот мы его вызываем. Добиваться возврата undefined - неуёмный перфекционизм

Filipp
15.08.2016
19:55:29
Как вариант можно заменить R.when на R.ifElse` и в conditionally передавать вторым аргументом R.always(void 0)

Дмитрий
15.08.2016
19:55:30
То есть это делается просто заменой R.when на R.ifElse( ...., ...., ()=>undefined), но такая запись вызывает куда больше вопросов и не несёт никакой пользы

Filipp
15.08.2016
19:55:43
=)

Дмитрий
15.08.2016
19:55:53
?

Alex
15.08.2016
19:57:26
ну что какой вердикт FP?

пойдет вместо if then?

хотябэ ramda

Дмитрий
15.08.2016
19:59:25
Ну вот пока мы писали эту строчку, нашли неявные условия и проблемы в тз, так что)

Alex
15.08.2016
20:00:28
таблица вход-выход хотя бы должна быть

Alex
15.08.2016
20:03:34
в общем смысл в том, чтобы привести логику к композции функции и по максимуму избавиться от императива (операторов и итераторов)

в этом смыл в JS)

Google
Alex
15.08.2016
20:04:35
в других функциональных языках такой проблемы естественно не стоит)

Алексей
15.08.2016
20:04:45
БУХА ХА ХА ( Rambda пипец - when - всегда возвращаеть значение - нужен both )

https://jsfiddle.net/dpntwxa7/1/

Alex
15.08.2016
20:04:56
а тут мы говорим об функциональном JS коде

Алексей
15.08.2016
20:04:59
R.both( R.when(Boolean, valueIsAllowed), doSomething)(getSomething('cool'))

можно чуть красивее let something = getSomething(‘cool’) R.both( R.when(Boolean, valueIsAllowed), doSomething)(something)

Дмитрий
15.08.2016
20:06:07
Alex
15.08.2016
20:06:11
в этом есть кстати приемущество JS

Алексей
15.08.2016
20:06:22
Так это же по доке так, не?)
Это МЯГКО говоря не интуитивно

Alex
15.08.2016
20:06:45
в этом смысле, если есть какая-то сложная логика, ее кусок можно написать тупо императивно, чтобы не тратить время, а потом уже по уму доделать

для изучения FP самое оно

Дмитрий
15.08.2016
20:07:18
Это МЯГКО говоря не интуитивно
У нас stream, функция должна возвращать значение. Если она его не меняет (not when), значит должна оставлять неизменным

Alex
15.08.2016
20:09:11
по-тихоньку можно все операторы изучить

на самом деле их там не так много

Дмитрий
15.08.2016
20:09:58
Я так уже месяц сижу, с открытой вкладкой доки) Постепенно почти все функции сами собой запоминаются

Alex
15.08.2016
20:10:32
у меня тоже всегда открыта вкладка доков и playground

с rx точно так же, тоже запоминается все через какое-то время

Google
Alex
15.08.2016
20:12:36
так что сначала на ramda потом на cycle)

andretshurotshka?❄️кде
15.08.2016
20:19:17
http://sanctuary.js.org ещё есть

Ilya
15.08.2016
20:20:58
Это что, option в js?

Alex
15.08.2016
20:26:31
http://sanctuary.js.org ещё есть
ты использовал ее?

Ҫѐҏӗѫӑ
15.08.2016
21:04:19
sanctuary — это либа от одно из коллабов рамды

набор монадок

ваще есть еще ramda-fantasy

Alex
15.08.2016
21:09:33
и что если сравнивать их?

есть опыт?

Ҫѐҏӗѫӑ
15.08.2016
21:11:59
сэнкчари более старая. тот чувак пишет обе в принципе. ramda-fantasy реализает спеку fantasy-land

сэнкчари — нет

поэтому у сэнкчари нет совместимости с другими либами, но это есть у ramda-fantasy.

вообще про это issue была в репе одной из них, где он рассказывает это все

еще есть folktale

она тоже вроде по фэнтези-лэнд

Alex
15.08.2016
21:15:13
судя по названию)

Ҫѐҏӗѫӑ
15.08.2016
21:16:50
https://github.com/ramda/ramda-fantasy/issues/105#issuecomment-196121566

Владимир
15.08.2016
21:22:55
Про рамду ?на ней вся логика вырастает в разы а толку нет

Ҫѐҏӗѫӑ
15.08.2016
21:23:24
это зависит от многого

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