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

Алексей
15.08.2016
19:19:21

Дмитрий
15.08.2016
19:19:39

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

Дмитрий
15.08.2016
19:21:11

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

Дмитрий
15.08.2016
19:21:30

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

Google

Алексей
15.08.2016
19:22:33

Дмитрий
15.08.2016
19:23:45

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

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


Filipp
15.08.2016
19:40:23
'Something c' не содержит подстроки 'cool', вот он и не апперкейсит
если заменить c на cool, будет апперкейсить

Алексей
15.08.2016
19:46:19

Дмитрий
15.08.2016
19:46:31

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

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

Дмитрий
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
таблица вход-выход хотя бы должна быть

from
15.08.2016
20:02:01


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

Алексей
15.08.2016
20:08:34

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

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

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

Алексей
15.08.2016
20:10:22

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

from
15.08.2016
20:26:42

Ҫѐҏӗѫӑ
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
это зависит от многого