
Vasiliy
21.02.2017
14:29:43
о, кстати да, спасибо)

from
21.02.2017
14:30:21
:)

Владимир
21.02.2017
14:54:03
...
withState('state', 'setState', {
username: '',
password: '',
persist: true,
showPassword: false,
}),
withHandlers({
handleUsernameChange: ({ state, setState }) => (event: React.FormEvent<HTMLInputElement>) =>
setState({ ...state, username: event.currentTarget.value }),
handlePasswordChange: ({ state, setState }) => (event: React.FormEvent<HTMLInputElement>) =>
setState({ ...state, password: event.currentTarget.value }),
togglePersist: ({ state, setState }) => () =>
setState({ ...state, persist: !state.persist }),
...
еще можно делать evolve
setState(evolve({
[name]: value
}))

Vasiliy
21.02.2017
14:54:52
о, кстати вариант, спасибо
только там ф-ция вместо value, но тем лучше)
change: ({ setState }) => (event: React.FormEvent<HTMLInputElement>) =>
setState(evolve({ [event.currentTarget.name]: always(event.currentTarget.value) }),
toggle: ({ setState }) => (event: React.FormEvent<HTMLInputElement>) =>
setState(evolve({ [event.currentTarget.name]: not })),

Google

Дмитрий
21.02.2017
15:06:55
В целом да. Естественно любая из них может быть Nothing
const set1 = [Maybe.of({ title: 'Russia' }), Maybe.of({ name: 'Moscow' })]
const checkMaybe = ifElse(__, Maybe.of, Maybe.Nothing)
const checkProp = pipe(has, checkMaybe)
const getProp = propName =>
pipe(
chain(checkProp(propName)),
map(prop(propName)))
const propsPair = pipe(
map(getProp),
useWith(pair),
apply )
const titleNameProps = propsPair(['title', 'name'])
const onlyOne = pipe(length, equals(1))
const joinProps = pipe(
sequence(Maybe.of),
map(join(', '))
)
const setTransform = pipe(
titleNameProps,
reject(Maybe.isNothing),
cond([
[onlyOne, head],
[isEmpty, Maybe.Nothing],
[T, joinProps]
]))
setTransform(set1)
На выходе так же будет внутри монады
https://goo.gl/aew1za
Бесит что в рамде нет функций, применяемых сразу к длине ?
Приходится pipe ( length, func ) городить


from
21.02.2017
15:15:17
const set1 = [Maybe.of({ title: 'Russia' }), Maybe.of({ name: 'Moscow' })]
const checkMaybe = ifElse(__, Maybe.of, Maybe.Nothing)
const checkProp = pipe(has, checkMaybe)
const getProp = propName =>
pipe(
chain(checkProp(propName)),
map(prop(propName)))
const propsPair = pipe(
map(getProp),
useWith(pair),
apply )
const titleNameProps = propsPair(['title', 'name'])
const onlyOne = pipe(length, equals(1))
const joinProps = pipe(
sequence(Maybe.of),
map(join(', '))
)
const setTransform = pipe(
titleNameProps,
reject(Maybe.isNothing),
cond([
[onlyOne, head],
[isEmpty, Maybe.Nothing],
[T, joinProps]
]))
setTransform(set1)
не подумайте, что я мегаспор хочу устроить или намеренно покритиковать, но по-моему такой код — неадекватно для задачи "взять name у одного объекта, title у другого и вывести строкой"
неужели fp не позволяет записать эту простую мысль простым образом?...
Вроде как fp подразумевает, что мы не создаём ненужные переменные, а здесь их создано 8 (!) штук. Только конечно мы себя обманываем и говорим, что эти переменные, разумеется, "жутко полезные функции, которые можно повторно использовать".


Дмитрий
21.02.2017
15:15:55
Просто ramda-fantasy не то, чтобы балует нужными функциями
"Карта, ложка, иди копай"
В этом плане sanctuary получше будет, и короче

from
21.02.2017
15:17:20
гм, ну надеюсь))

Дмитрий
21.02.2017
15:17:46
Ну и про рамду я уже пожаловался
Я хотел сделать либу поверх неё, чтоб сама разбирала вызовы типа R.lengthGt0
Но прокси в жс тормозят

Google

Дмитрий
21.02.2017
15:18:38
Жизнь боль
А, и паттерн матчинг не завезли, из-за этого с cond тоже не оч изящно выглядит

from
21.02.2017
15:30:15
И я уж прошу прощения за совсем неприличные вещи, но реально всё функциональное решение вот:
const address = [
(city || {}).name,
(country || {}).title,
]
.filter(x => x)
.join(', ');
без зависимостей

Алексей
21.02.2017
15:36:09

andretshurotshka?❄️кде
21.02.2017
15:36:43

from
21.02.2017
15:39:44
https://goo.gl/6uPpjH ?
вот только joinMaybes не соответствует названию, выдаёт массив
скорее это mapMaybes. Тоже довольно таинственное название.
Но в целом читаемо уже :)

Дмитрий
21.02.2017
15:40:28
А в виде функции оно вжух! и теряет особую разницу с решением из sanctuary
const joinMaybes = useWith(
pipe(pair, S.justs, join(', ')), [
chain(S.get(String, 'name')),
chain(S.get(String, 'title'))
])
joinMaybes( city, country )

Evgeny
21.02.2017
16:20:24

andretshurotshka?❄️кде
21.02.2017
16:27:48

Vladimir
24.02.2017
01:56:29
https://www.reddit.com/r/functionalprogramming/comments/5vopkq/functional_architecture/?st=IZJ62CS8&sh=3aa3abea

Yumi
24.02.2017
02:23:42
сам хотел тут спросить. круто.

Vladimir
24.02.2017
03:10:05

Дмитрий
24.02.2017
07:30:56
Ну про джаву веселее было)

Alex
24.02.2017
08:00:52
Про указатели еще смешней)

Дмитрий
24.02.2017
08:02:01

Alex
24.02.2017
08:05:18
Я даже не знаю как найти

Google

Alex
24.02.2017
08:05:21
Там типа
-Какая у тебя глубина указателей?
-Ну тип 2-3
-Бедняжка, смотри,
Void ******************

Дмитрий
24.02.2017
08:08:31
?

Aleh
24.02.2017
09:12:24
В таких решениях теряется декларативность(та, которая противоположность императивному, а не которая равна фп). Теряется возможность читать код как историю или описание того, что я получу на выходе
Ну т.е. это старая добрая императивщина с лишними абстракциями
С чем боролись :)

Дмитрий
24.02.2017
10:06:22
Чтобы использовать map нужно написать map)
Причём, скорее всего, есть варианты и лучше
Без in-place императивщины с вжух-магией .filter(x => x)

andretshurotshka?❄️кде
24.02.2017
12:51:12
вжух

Aleh
25.02.2017
09:34:35

Дмитрий
25.02.2017
09:36:16
Про код, который предлагался в качестве альтернативы) Намертво захардкоженый

Aleh
25.02.2017
09:37:41

Дмитрий
25.02.2017
09:38:22
О, вот и ещё две строчки прилетело))

Aleh
25.02.2017
09:38:48
Не, количество строк не изменилось)

Дмитрий
25.02.2017
09:40:15
Как и изящный хак с` .filter(x => x)`

from
25.02.2017
09:40:42

Google

from
25.02.2017
09:40:59

Дмитрий
25.02.2017
09:41:20
Это неочевидный приём

from
25.02.2017
09:42:52
Это неочевидный приём
Хорошо. А если я напишу .filter(identity), предварительно определив identity, это перестанет быть хаком?

Дмитрий
25.02.2017
09:44:55
Вы упорно игнорируете замечания о том, что это особенности конкретной либы, и половина функций — универсальные хелперы

from
25.02.2017
09:45:00

Дмитрий
25.02.2017
09:45:11
Ох
Окей

from
25.02.2017
09:45:17

Дмитрий
25.02.2017
09:45:45
Да
Это по прежнему фиговый код
Потому что есть пути гораздо оптимальнее но мне уже надоело
Но который показывает, сколько всего зависит от выбранной либы и того, чего в ней нет
Вообще, вы кстати как то ловко игнорируете условия задачи
Объекты уже в Maybe
И на выходе желательно бы тоже его вернуть, но это уже ладно, пофиг

from
25.02.2017
09:48:04
Это по прежнему фиговый код
Ну а какой хороший? : /
Опять же, я не хочу что-то глобально плохое про фп сказать. Но надо же разумно смотреть на то, что получилось.
Читаю вот книжечку как раз, там фраза
> Be warned, however, pointfree is a double-edged sword and can sometimes _obfuscate intention_. Not all functional code is pointfree and that is O.K.
И мне кажется она не про только pointfree уместна, а гораздо шире)

Дмитрий
25.02.2017
09:51:06
В любом случае, синтаксис жс плохо предназначен для ёмкого фп
Я просто тут PureScript потыкал ?

Google

Дмитрий
25.02.2017
09:56:20
Который как хаскель, но с нормальным интеропом в js
Рекурсию до while разворачивает, и прочие умные штуки под капотом
Ну и короче там такое выглядит не в пример лучше


from
25.02.2017
10:00:43
Вы упорно игнорируете замечания о том, что это особенности конкретной либы, и половина функций — универсальные хелперы
я бы охотно поверил. Но разве это правда так? Я вижу восемь функций
checkMaybe, checkProp, getProp, propsPair, titleNameProps, onlyOne, joinProps, setTransform
Какие из них _реально_ универсальные? (понятно что теоретически при особой "удаче" все могут где-то пригодиться)
Все? Половина? Первые три вполне реюзабельны и по их названию понятно, что они делают. Остальные... хм, тоже возможно могут пригодиться, но вот названия у них как раз не особо.
propsPair? С ходу понятно, что это?
joinProps? Джоин каким символом?
setTransform? Я таким названием могу почти все обработчики серверных ответов назвать :)
titleNameProps ладно уж, её инлайнить можно было
В общем не знаю, может когда-то я тоже на подобном языке заговорю :) Но пока что просто кажется, что кто-то перебарщивает


Дмитрий
25.02.2017
10:00:45
Хотя от мануала с разговором о profunctors optics ещё в первой трети, становится слегка не по себе конечно ?

from
25.02.2017
10:01:06

Дмитрий
25.02.2017
10:02:22
Судя по течению диалога, после предоставления решения на purescript, ты будешь активно хейтить решение на Sanctuary

from
25.02.2017
10:02:43
А это плохо?)

Дмитрий
25.02.2017
10:04:15
Игнорировать сообеседника? Ну как тебе сказать

andretshurotshka?❄️кде
25.02.2017
10:05:56
?

from
25.02.2017
10:08:56

Дмитрий
25.02.2017
10:09:35
Я это уже давно заметил
Я в четвёртый раз за диалог повторяю тебе, что решение на требуемой библиотеке попросту неоптимально изначально, к чему был весь этот код ревью выше? Я понимаю тебе в кайф блестще расписать всё, но за нитью диалога то надо следить

from
25.02.2017
10:16:24
Ок, на выходе — два решения, которые ты сам же называешь хреновыми, и фразы "нормальные решения правда-правда есть при нормальных языках / либах, но т.к. надоело, их писать не буду".
Хорошо. Однажды сам приду к этим решениям.
А то что что собеседник что-то "игнорирует" сказать легко. У нас чат, а не устный диалог, сообщения сохраняются. Если я что-то пропустил или "проигнорировал" — скопируй снова, или дай ссылку, или как угодно.

Дмитрий
25.02.2017
10:16:55
Ясно

from
25.02.2017
10:17:12

Aleh
25.02.2017
11:03:44
в хаскеле я бы записал это как-то так https://goo.gl/JuvrCP
но в жс оно требует тянуть бессмысленную либу, в которой определены все эти Maybe, хотя оно уже итак есть с другими названиями и записано в коде @everdimension