@Fsharp_chat

Страница 510 из 772
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 ничем отличаться не будет?

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

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
DU тебе позволяет набор сообщений ограничить.
Аналогично их можно ограничить другим способом

С помощью 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. Но что вы имеете в виду в своём примере под "всего лишь один из способов понять, что мне надо сделать"

?‍?
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
Проблема наследования в том, что DU описывает набор всех возможных кейсов, а наследование - позволяет расширять.
Сразу по синтаксису, DU это тоже расширение же, и не нельзя создавать общие поля, например - почему?

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

И ровно один.

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

Это объединение ВСЕХ кейсов

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

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
ну да, record/tuples, discriminated unions
только record - это произведение, а DU - сумма

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# - два из трех понятия математических

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

В C# есть только рекорды/таплы + ссылка на себя

Или ссылка на тип? Не обязательно же на себя?

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

?‍?
13.03.2018
09:56:37
В C# есть только рекорды/таплы + ссылка на себя
Вы к тому, что на C# нет дизьюнкции

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

Страница 510 из 772