@react_js

Страница 2277 из 5115
Дмитрий
10.10.2017
01:34:34
К каким именно словам ты хотел бы придумать контрпример?
Нормальной внятной мысли почему maybe это плохо. Мне может реально интересно, почему Но из всего диалога я вынес только то, что ты попрбовал и тебе не понра Теперь мне придётся с этим как-то жить

Котяй Негодяй
10.10.2017
01:35:37
Ну а это не то, чтобы кого-то сильно сейчас интересует.
Ага. Именно поэтому потом нас и приглашают пилить интранет продукты, чтобы выпилить трэш от 1С, который невозможно использовать. Реальный кейс. Сам таким занимался.

Ҫѐҏӗѫӑ
10.10.2017
01:35:57
mst оооочень медленный

Котяй Негодяй
10.10.2017
01:36:11
"Настраивал вебпак". Лол.

Google
Ҫѐҏӗѫӑ
10.10.2017
01:36:14
для моих кейсов

Дмитрий
10.10.2017
01:36:22
Вдвойне фигово(

Ҫѐҏӗѫӑ
10.10.2017
01:37:06
ну у меня риалтайм и модели жирные

2 Гб и 133% цпу ест

Дмитрий
10.10.2017
01:37:53
?

Сурово

Опять короче велосипедить по ходу

Ҫѐҏӗѫӑ
10.10.2017
01:39:58
вообще такое ощущение, что проверки не все в прод билде отключаются

Дмитрий
10.10.2017
01:49:52
Ох щи

// TODO: this test still needed? ... Object.freeze(this.properties) // make sure nobody messes with it Конструктор модели

kana
10.10.2017
01:51:32
Нет. Ни за чем он там не нужен. Можно абсолютно спокойно и безболезненно обойтись без него.
Именно поэтому в восьмой джаве появивился Optional, ведь они спокойно безболезненно работали с Null pointer exception

Юра
10.10.2017
01:55:06
Нормальной внятной мысли почему maybe это плохо. Мне может реально интересно, почему Но из всего диалога я вынес только то, что ты попрбовал и тебе не понра Теперь мне придётся с этим как-то жить
Ну, смотри, во-первых, я не утверждаю, что Maybe — это плохо. Я утверждаю, что если ты будешь писать коммерческий код с использованием maybe, то это приведет либо к а) чрезмерно запутанному коду, либо к б) продалбыванию сроков проекта. Ну, банальный пример. С сервера нам приходит модель: setState({ name: 'John Doe' }); Пишем обработчик формы с Maybe: <input type="text" defaultValue={this.state.name} onChange={(event) => { const value = Maybe(event.target.value); this.setState({name: value}); // WTF? this.state.name будет иметь два типа: String из JSON-а, и Maybe, потому что мы его туда положили. }} /> Придется доработать форму: <input type="text" defaultValue={isMaybe(this.state.name) ? this.state.name.value() : this.state.name} onChange={(event) => { const value = Maybe(event.target.value); this.setState({name: value}); }} /> Спрашивается, нафига так делать, если и без этого все прекрасно работает?

Google
Юра
10.10.2017
01:56:24
Именно поэтому в восьмой джаве появивился Optional, ведь они спокойно безболезненно работали с Null pointer exception
Не. Если это поддерживатеся на уровне платформы — базара ноль. Абсолютно ничего не имею против нативных промисов, или Option в rust-е.

Юра
10.10.2017
01:58:56
Полагаю, в жс тоже скоро может появиться .? Это не то, но все же шажок
Ну, вот если/когда появится, тогда и можно будет всерьез подумать. В JS-е довольно много вещей, которые так и не были по-настоящему восприняты сообществом.

Дмитрий
10.10.2017
02:00:08
Ты прав в том, что подключать maybe а потом всё обмазывать проверками на isMaybe — это шиза

В таком виде естественно ничего не нужно, что подводит нас к мысли о том, что видимо всё же ими пользуются как-то иначе

Юра
10.10.2017
02:01:10
Ты прав в том, что подключать maybe а потом всё обмазывать проверками на isMaybe — это шиза
Ну, типа, суть то от этого не меняется. Делать на любой чих fromNullable из той же серии.

kana
10.10.2017
02:01:32
Ну, смотри, во-первых, я не утверждаю, что Maybe — это плохо. Я утверждаю, что если ты будешь писать коммерческий код с использованием maybe, то это приведет либо к а) чрезмерно запутанному коду, либо к б) продалбыванию сроков проекта. Ну, банальный пример. С сервера нам приходит модель: setState({ name: 'John Doe' }); Пишем обработчик формы с Maybe: <input type="text" defaultValue={this.state.name} onChange={(event) => { const value = Maybe(event.target.value); this.setState({name: value}); // WTF? this.state.name будет иметь два типа: String из JSON-а, и Maybe, потому что мы его туда положили. }} /> Придется доработать форму: <input type="text" defaultValue={isMaybe(this.state.name) ? this.state.name.value() : this.state.name} onChange={(event) => { const value = Maybe(event.target.value); this.setState({name: value}); }} /> Спрашивается, нафига так делать, если и без этого все прекрасно работает?
Код, как у тебя - та же хрень, что проверка на null, функториальность и монадность мэйби позволяет работать со значением так, будто оно всегда есть, а все проблемы улетят куда-то в сторону, где мы их потом обработаем, если нужно. Иначе мэйби ничем от нала отличаться не будет

Юра
10.10.2017
02:01:33
Это я тебе как человек, который писал довольно много кода с Promise.join.

Типа, функция, которая в аргументах может принять промис, а может и не промис, но внутри функции нужно работать все равно с конкретным значением.

Дмитрий
10.10.2017
02:02:58
.map

.chain

Юра
10.10.2017
02:03:19
Дмитрий
10.10.2017
02:03:19
Ты пытаешься приделать новую концепцию к старым повадкам, это так не работает

Лол

kana
10.10.2017
02:05:11
Я как вспоминаю старый свой гошный код с десятком if err на функцию, так седею. Го абсолютно точно нужен ейзер, можно и встроенный. Вспомнил про него, когда начал писать пример на жс с мейби

Юра
10.10.2017
02:06:50
Я как вспоминаю старый свой гошный код с десятком if err на функцию, так седею. Го абсолютно точно нужен ейзер, можно и встроенный. Вспомнил про него, когда начал писать пример на жс с мейби
Это у тебя скорее всего, в том, что ты писал в структурном стиле. Множество if-ов в коде говорят о том, что у тебя много вызовов на разных уровнях абстракции.

Кароч, долго объяснять, но функция должна оперировать только одним уровнем абстракции.

Google
Юра
10.10.2017
02:07:27
Читать дядюшку Боба.

kana
10.10.2017
02:07:34
Нет, там простая каждая функция вернуть ошибку, нужно все обработать

Дмитрий
10.10.2017
02:07:41
В этом коде 11 проверок на null

Юра
10.10.2017
02:08:25
Это elm?

Дмитрий
10.10.2017
02:08:40
И это лишь небольшая часть гораздо более крупного алгоритма, целиком завязанного на такие проверки

Это elm?
purescript

Юра
10.10.2017
02:09:09
Вспоминается LiveScript.

Дмитрий
10.10.2017
02:09:24
У кого какие аналогии

kana
10.10.2017
02:09:36


Го

Юра
10.10.2017
02:09:41
Я вообще не понимаю смысла этого кода. Судя по всему, тут не в Maybe дело.

Дмитрий
10.10.2017
02:10:12
А теперь самый момент напомнить про тупых фронтендеров

Судя по всему тут не в Maybe дело, да ?

Но вообще это довольно тривиальная конструкция, я типа учусь и всё такое

Юра
10.10.2017
02:12:51
Ага. Совершенно точно диагноз поставил. Прям горжусь собой. У тебя в одной функции и запрос к серверу, и разбор ответа, и маппминг в объект и маршаллинг.

Это все должны быть разные подсистемы: транспортная, доменная модель, бизнес-логика. Кароч, ну ты понел.

Но вообще это довольно тривиальная конструкция, я типа учусь и всё такое
Можешь в пяти словах описать что делают эти две функции?

kana
10.10.2017
02:14:43
Есть некая f, которая может вернет, а может не вернет значение. const a = f(1); if (a !== null) { const b = f(a); if (b !== null) { const c = f(b); if (c !== null) { doSmth(a, b, c); } } } Если мы заменим на Maybe вместо null и будем делать такие же проверки isMaybe, как ты предлагаешь, то ничего не измениться. Но есть ду-нотация, она же async/await для промисов в жс (только не так). const f = x => x === 5 ? just(5) : nothing(); //... const a = yield f(1); const b = yield f(a); const c = yield f(b); doSmth(a, b, c); В результате все проблемы (nothing) улетают во время выполнения yield-ов

Google
Юра
10.10.2017
02:18:28
kana
10.10.2017
02:18:36
Scala: for { a <- f(1), b <- f(a), c <- f(b) } yield doSmth(a, b, c); Haskell (тут правда doSmth обязан мейби отдавать) do a <- f 1 b <- f a c <- f b doSmth a b c .

Монады собственно и решают проблему вложенности в общем случае, они m(m(x)) к m(x) сводят, это и колбеки (фьючерсы, промисы), и ифы (мэйби, ейзер)

Юра
10.10.2017
02:19:52
Я просто довольно много писал кода с null-propagation-ом. И я вам могу сказать, что это лишь усугубляло ошибки.

kana
10.10.2017
02:21:26
Юра
10.10.2017
02:23:53
Кароч, если объяснишь что этот код делает, я, может быть и смогу сказать как его улучшить. Сейчас я даже конструкций языка не понимаю.

kana
10.10.2017
02:28:24
Ага. Совершенно точно диагноз поставил. Прям горжусь собой. У тебя в одной функции и запрос к серверу, и разбор ответа, и маппминг в объект и маршаллинг.
Код не мой, это так выглядит любой го-код) Каждая функция может вернуть ошибку, даже если бы в этом коде все функции работали бы только с файлами, то есть абсолютно ничего бы не поменялось

Дмитрий
10.10.2017
02:30:06
Кароч, если объяснишь что этот код делает, я, может быть и смогу сказать как его улучшить. Сейчас я даже конструкций языка не понимаю.
Валидация входящих данных, большой глубоко вложенный json с кучей кейсов пошагово типизируется чередой вложенных чтений полей и выбору кейсов на основе результатов

Точнее не валидация, а часть классификатора данных

Admin
ERROR: S client not available

Юра
10.10.2017
02:33:03
Код не мой, это так выглядит любой го-код) Каждая функция может вернуть ошибку, даже если бы в этом коде все функции работали бы только с файлами, то есть абсолютно ничего бы не поменялось
Ну, если на го работают программисты, которые не способны правильно структурировать программу, то это, в общем-то их проблемы. В ноде тоже такая же история была. Итог печален весьма.

kana
10.10.2017
02:33:52
Да хотя бы дешевые исключения решили бы проблему

Что у тебя за pureJust, pure+join?

Дмитрий
10.10.2017
02:36:18
Вся фигня в том, что это самое начало, а дальше начнутся вложенные комбинации из-за которых я и решил написать на пурсе https://github.com/zerobias/telegram-mtproto/blob/feature/mtproto3/packages/mtproto-classify/src/Classify/Import.purs#L59

Юра
10.10.2017
02:36:40
Валидация входящих данных, большой глубоко вложенный json с кучей кейсов пошагово типизируется чередой вложенных чтений полей и выбору кейсов на основе результатов
Ну, это боль, да. Но в зависимости от конкретной ситуации, конечно, все равно можно подобрать правильную абстракцию для такого.

Дмитрий
10.10.2017
02:37:06
Что у тебя за pureJust, pure+join?
Ага, я интуитивно догадываюсь, что там много вздорных конструкций))

kana
10.10.2017
02:37:55
можно было просто вернуть значение без pureJust)

pureJust $ f x === f x )

Дмитрий
10.10.2017
02:38:50
Ну, это боль, да. Но в зависимости от конкретной ситуации, конечно, все равно можно подобрать правильную абстракцию для такого.
Я очень долго пытался, поверь) Это просто классификация, а дальше ещё использование этой классификации +_-

Google
Юра
10.10.2017
02:39:15
Ага, я интуитивно догадываюсь, что там много вздорных конструкций))
А просто восходящим анализом проблему не решить?

Ну, я имею в виду, поднимаешься от листов к корню и на каждом шаге возвращаешь новый объект в зависимости от значений родителя.

Дмитрий
10.10.2017
02:41:58
А просто восходящим анализом проблему не решить?
Там даже расположение элементов не регламентировано, может быть один, может быть массив второго уровня, некоторые элементы могут быть ещё глубже, а чтобы было не оч скучно — некоторые объекты прилетают без тела, и это становится ещё одной категорией кейсов (х2)

То есть тебе эти листья ещё нужно найти

Юра
10.10.2017
02:46:37
Ну, типа, я тобой горжусь, что ты такие задачи умеешь решать и даже нашел где применить Maybe монаду.

https://github.com/zerobias/telegram-mtproto/blob/feature/mtproto3/packages/mtproto-classify/src/Classify/Import.purs

Вот сюда смотрю.

Дмитрий
10.10.2017
02:58:30
можно было просто вернуть значение без pureJust)
Вспомнил, это что-то типа траверса было, Array Maybe a -> Array a

kana
10.10.2017
02:58:59
Монады можно не расценивать как обычные значения, их смысл намного больше. У тебя есть какой-то обычный мир вычислений, 5 функций подряд, все как обычно, это Identity-мир. Но мы можем писать код в Maybe-мире, это такой же мир, как и предыдущий, те же 5 функций, ты работаешь с данными как обычно, только каждая из 5 операций может выкинуть тебя из мира, то есть Maybe дает эффект прерывания выполнения кода в этом мире. Есть either, который то же самое, только позволяет нашему коду вылететь из мира с каким-нибудь сообщением. Есть promise, который позволяет нам писать обычный код, только каждая из функций может быть ассинхронной, хоть в нашем промис-мире мы этого не видим

Когда осознаешь, что монады - это такие отдельные миры поверх чистого мира с каким-то эффектом, то перестаешь писать x.isJust() ? X.valus : ...

Поэтому сложно не найти применение мэйби, а "не найти его")

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

Юра
10.10.2017
03:05:30
Я так понимаю, что на JS-е это можно переписать примерно так: const smokeTest = (text) => JSON.parse(text, (key, obj) => { const tlType = lookupTLType(obj); let val, arr; switch (tlType) { case 'msg_container': { if ((val = obj.messages) && (arr = toArray(val))) { obj = messagesNormalize(arr) return pureJust(obj); } } case 'rpc_result': { return messagesNormalize(obj); } } });

kana
10.10.2017
03:07:10
Нет, lookup отдает Maybe

Там весь код работает в мире мейби, то есть если функция какая справа от <- вернет Nothing, то весь код прерывается и возвращается Nothing У тебя же никакой проверки нет. Хотя кейс просто ничего не сделает

Юра
10.10.2017
03:08:31
Нет, lookup отдает Maybe
Ну, я предполагаю что раз это на js-е, то Lookup отдает строку или undefined.

Я вижу в коде два раза используется messageNormalize.

Дмитрий
10.10.2017
03:13:40
Ну, я предполагаю что раз это на js-е, то Lookup отдает строку или undefined.
toArray тоже отдаёт Maybe, как и остальные функции И это мы ещё даже к самой классификации не перешли, а код уже выстроился мутабельной лесенкой

David
10.10.2017
03:13:56
Только медленный ппц

Юра
10.10.2017
03:21:55
// toArray тоже считаем, что возвращает undefined если не удается привести к нужному типу. const smokeTest = (text) => JSON.parse(text, (key, obj) => { switch (obj._) { case 'msg_container': let arr; if (obj.messages && (arr = toArray(obj.messages))) { return arr.map(messageNormalize); } case 'rpc_result': return messageNormalize(obj); } });

Даже так, наверное. Я исхожу из предположения, что obj.messages может быть либо массивом, либо пустым значением, не объектом. Если я не прав, то прошу поправить. Тода так получится: const smokeTest = (text) => JSON.parse(text, (key, obj) => { switch (obj._) { case 'msg_container': return Array.isArray(obj.messages) ? obj.messages.map(messageNormalize) : undefined; case 'rpc_result': return messageNormalize(obj); } });

Страница 2277 из 5115