
Pavel
13.03.2018
09:12:33
Россия. 2018. Собеседование. — Так, а теперь поговорим о зарплате... 12 килограмм еды Вас устроит? — И бутылку вина. — Кагор. — Блин, ок
Ой, не то.
Есть web-socket, как уже говорил - в него сыплется всякое в JSON, снаружи хотелось бы разделить этот поток на несколько по типам, для этого сначала надо бы распарсить в один общий поток
Вопрос - какой тип событий должен быть в этом потоке?

Google

Vasily
13.03.2018
09:13:59
IMessage
Скорее всего
Дальше варианты
Самый нормальный с моей точки зрения - на атрибутах

Pavel
13.03.2018
09:14:28
Ну да, ты же понимаешь проблема какая?

Vasily
13.03.2018
09:14:52
Чтобы is не писать

Pavel
13.03.2018
09:14:53
Что если между сообещниями ничего общего нет, то IMessage от Object ничем отличаться не будет?

Siarhei
13.03.2018
09:15:03

Pavel
13.03.2018
09:15:05
В смысле, а как ты дождешься Authenticated?

Vasily
13.03.2018
09:15:08

Siarhei
13.03.2018
09:15:13
ты видишь что туда не всё отправляется

Vasily
13.03.2018
09:15:18
Тебе главное правильные обработчики навесить

Siarhei
13.03.2018
09:15:20
а то что с маркером

Google

Pavel
13.03.2018
09:15:32
Ну это мелочи, на самом деле.
DU тебе позволяет набор сообщений ограничить.
Ну в смысле DU со всеми возможными контрактами того API - лучше

Vasily
13.03.2018
09:16:08
С помощью DI, например

Pavel
13.03.2018
09:16:32
Ну еще раз, это всего лишь вопрос того, что такое дискриминатор.
В случае IMessage - это конкретный тип сообщения, в случае DU - кейс
Ты фактически DU эмулируешь через тулинг OOP

Vasily
13.03.2018
09:17:43
DU - всего лишь один из способов понять, что мне надо сделать

Pavel
13.03.2018
09:20:17
(стикер с Егором)

??
13.03.2018
09:21:06
DU - всего лишь один из способов понять, что мне надо сделать
Подробнее, пожалуйста. Например, у меня есть слот, куда кладутся разные структуры на выбор пользователя (не массивом или массивом), сам слот представлен как DU. Но что вы имеете в виду в своём примере под "всего лишь один из способов понять, что мне надо сделать"

Vasily
13.03.2018
09:26:34
В случае С# - там другие варианты

??
13.03.2018
09:27:47
Не понятно

Pavel
13.03.2018
09:28:43
Ок, это называется - ADT, Algebraic Data Types
Понятно ли, что тапл и рекорд - одно и то же?
Просто у рекорда позиции в списке имеют название, а у тапла - номер.
В дискретной математике это называется "Коньюнкция".
Собственно дальше для описания данных в дискретной математике есть "Дизьюнкция"
В F# - это Discriminated Unions, в C# - приходится играться с наследованием.

Google

Pavel
13.03.2018
09:30:59
Проблема наследования в том, что DU описывает набор всех возможных кейсов, а наследование - позволяет расширять.
И тебе, чтобы перебрать все варианты уже приходится использовать полимформизм вместо того, чтобы написать if/switch/patter-matching

Vasily
13.03.2018
09:32:20
Короче, коллеги, дискуссия постепенно скатывается к бессмертному вопросу, а где именно в коде разместить калоотстойник

??
13.03.2018
09:32:26

Pavel
13.03.2018
09:32:59
DU - это не расширение, это как раз пересечение, у тебя оно всегда один из вариантов перечисленных.
И ровно один.

??
13.03.2018
09:33:36

Pavel
13.03.2018
09:33:40
Я к тому, что коньюнкция и дизьюнкция позволяют описать любые структуры данных (не задумывался как доказать этот факт)
Это объединение ВСЕХ кейсов

Anna
13.03.2018
09:34:06

Pavel
13.03.2018
09:34:35
Анна, в смысле рекурсивные структуры?

Anna
13.03.2018
09:34:53

Pavel
13.03.2018
09:34:56
У меня дискретка больше 15 лет назад была, все вылетело из головы.

Vasily
13.03.2018
09:35:46

Pavel
13.03.2018
09:35:50
А ссылка на самого себя - какой термин в математике?

Anna
13.03.2018
09:35:55

Vasily
13.03.2018
09:36:12
Надо, шоле, где-нить курс по дискретке пройти
Для общего образования

Anna
13.03.2018
09:36:29

Google

Vasily
13.03.2018
09:36:29
А то как лох последний

Pavel
13.03.2018
09:36:48
ну да, record/tuples, discriminated unions

Anna
13.03.2018
09:37:05

Pavel
13.03.2018
09:37:06
A / V
^ v точнее
только большие

Anna
13.03.2018
09:37:56
Итого, список из cons-ячеек это сразу все три вида:
Или None, или запись из головы и ссылки на хвост (рекурсивно)

Pavel
13.03.2018
09:39:12
type List 't = (::) of 't * List 't | []
https://www.brianthicks.com/guide/functional-sets/ - во, хорошая статья

Anna
13.03.2018
09:45:02

Pavel
13.03.2018
09:45:15
Да, я всегда их путал

Vasily
13.03.2018
09:45:19
Логично

Pavel
13.03.2018
09:45:20
кортеж - произведение

Vasily
13.03.2018
09:45:30
Теория категорий, вот это вот все

Pavel
13.03.2018
09:45:42
Нет, это дискретная математика, это не теория категорией
То есть теория категорий, это скорее часть дискретной математики, и ADT не в нее входит (как мне кажется)
Я могу врать, проверяйте в вики.

Siarhei
13.03.2018
09:49:17
не думаю что это часть дискретки

??
13.03.2018
09:52:05
Понятно ли, что тапл и рекорд - одно и то же?
Понятно. Далее...
> В дискретной математике это называется "Коньюнкция".
То есть это условия для полей или вообще список полей?
> Собственно дальше для описания данных в дискретной математике есть "Дизьюнкция"
Это уже сами Cat | Dog | Banana
> Проблема наследования в том, что DU описывает набор всех возможных кейсов, а наследование - позволяет расширять.
на С# abstract-override модель, а на F# записи в DU (по сути совокупность)
и там и там есть общие свойства (параметрический полиморфизм) и методы, не могу понять слово "расширять" не в контексте ООП - добавление полей к записи?

Pavel
13.03.2018
09:52:48
ООП - это про данные с поведением, мы же просто про данные сейчас

Google

Pavel
13.03.2018
09:53:25
Ну и да, как выяснилось, я вероятно коньюнкцию с дизьюнкцией перепутал.
Я просто про то, что в F# есть ADT из коробки, в C# их приходится эмулировать
В C# - два из трех понятия математических

??
13.03.2018
09:54:49

Pavel
13.03.2018
09:55:18
Ну для описания структур данных в математике вводятся три термина - коньюнкция, дизьюнкция, ссылка на себя, как поправила меня Анна.
В C# есть только рекорды/таплы + ссылка на себя
Или ссылка на тип? Не обязательно же на себя?

??
13.03.2018
09:56:11

Pavel
13.03.2018
09:56:28
Я уже забыл о чем беседа была ?

??
13.03.2018
09:56:37

Pavel
13.03.2018
09:56:45
В смысле DU в C# приходится выдумывать ее, да.
типа имьютабл класс с ограниченным количеством конструкторов
public sealed class MyDU { public readonly string StrValue; public readonly int? IntValue; public MyDU(string str) { ... } public MyDU(int n) { ... } }
И потом в коде проверять каждое из свойств на null

Evgeniy
13.03.2018
09:58:49
И в F# exhaustive pattern matching из коробки. А в C# решарпер же с этим помогает?

Pavel
13.03.2018
09:59:07
Да, предлагает кейсы по enum сгенерить
Плюс юнит-тесты приходится писать, что все кейсы обрабатываются
Кстати там же в какой-то версии в C# тоже это все обещают?
Как бы сбежать из дотнета к этому времени ж)

??
13.03.2018
10:00:50
Как сделать проверку типа, например это класс Cat или Banana, чтобы потом поместить в DU в правильный конструктор? Просто не смог найти примеров typeof

Siarhei
13.03.2018
10:03:16