Анна
вчера тут мне коллеги предложили разновидность дак тайпинга: "если ваш код выглядит как 💩, пахнет как 💩 ..."
Nikolay
Блин, а как бы сказать, что отсутствие DU это минус?
Nikolay
Ну т.е. там есть такие поля: InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardRemove or ForceReply Или такие: Integer or String
Nikolay
И как бы в F# я их сделал DU
Dmitry
https://twitter.com/vvzvlad/status/1039739071801774080?s=19 такое...
Nikolay
Вот так выглядят слайды
Nikolay
Типа перечисляю минусы .Net обёртки
gsomix
@Dolfik Может инвертировать?
gsomix
Рассказать о том, почему Funogram — это круто.
Hog
а почему \ - _не_ функционально?
Éminence grise
18 слайд мне кажется лучше назвать некомбинируемо.
gsomix
Фантомас :D
Автоподстановка. :)
Nikolay
а почему \ - _не_ функционально?
Ну потому, что функционально - это типы и функции, а не функционально - объекты и методы
Nikolay
Идея была такая, я говорю, что есть .Net обёртка над апи, но она не очень подходит для F#, и дальше объясняю почему
Vladislav
Блин, а как бы сказать, что отсутствие DU это минус?
Вот у тебя есть апи, в нем модель аттачмента. Аттачментов несколько типов может быть. Как это на сишарпе сделать? Через object и enum. На f# через du
Nikolay
Хз как слайд назвать
Vladislav
Чувак пришёл с кейсом этим
Vladislav
Хз как слайд назвать
Размеченные обьединения
Vladislav
Éminence grise
Вот у тебя есть апи, в нем модель аттачмента. Аттачментов несколько типов может быть. Как это на сишарпе сделать? Через object и enum. На f# через du
Не ну тут ты не прав. Можно через интрефейс и реализаторы, дальше кейз по типам. Можно через класс с наследниками - дальше то же. Можно вообще через DU в рукопашную написанное. Вопрос в том сколько бойлерплейта и неполном контроле от компилера. А так можно и влететь на комментариях.
Éminence grise
Ну JSON.NET тоже в DU не умеет.
Éminence grise
Правда об этом вслух лучше не говорить 😊
Nikolay
Ну JSON.NET тоже в DU не умеет.
Ну моя библиотека научила JSON.NET в DU :)
Nikolay
Только вроде там достаточно топорно сделано
Vladislav
Ну JSON.NET тоже в DU не умеет.
Как Ayrat говорит уже умеет
Éminence grise
Ну моя то же. Но из коробки нет. А биндер в интерфейс можно то же написать.
Vladislav
Вообщем чувак в том кейсе попробовал все
Vladislav
В итоге enum и object
Nikolay
Как Ayrat говорит уже умеет
Там ещё зависит как
Éminence grise
Именно, что через одно место из коробки.
Nikolay
Видел реализацию типа: { value: 123, ____case: "Int" }
Nikolay
Но это никуда не катит
Éminence grise
Ну более менее должно быть: { "Int" : 123 }
Vladislav
Fsharplu же как обертка над json net идёт
Vladislav
Которая ок
Éminence grise
А если совсем уж красиво: type Samle = | Int of int | Str of string вообще должен сам различать 123 и "123"
Vasily
А если там два стринга?
Éminence grise
А если два стринга - то как в первом случае
Romɑn
А как по идее должно быть? Опшн как сериализовать "правильно"? А пользовательский DU?
Éminence grise
None не сериализуется как свойство объекта. В массиве - как null.
Éminence grise
IMHO
Vasily
На самом деле проще всего в виде строки- квотейшна по идее
Éminence grise
У меня кастомизируется на уровне типа сериализации или атрибутом, или рулом. Но к сожплению, пока выложить не могу - не договорился с начальством (в смысле не успел еще)
Éminence grise
Его еще должен JavaScript читать. И желательно, TypeScript то же понимать как DU
Nikolay
Кажется неплохая картинка про мутабельность)
Ayrat
Как Ayrat говорит уже умеет
Давно умеет. Из коробки
Ayrat
Сериализация там обратимая потому страшная на вид
Éminence grise
Да, но очень уродливо.
Romɑn
{ } // { myField = None}
А если type DU = | MyVal of string | YourVal of string { foo : { myVal : "my"} , bar : { yourVal : "your" } // { foo = MyVal "my"; bar = YourVal "your" }
Romɑn
Что смущает ппц
Romɑn
Кстати, поверх akka.tcp можно же сделать нормальный вебсервер типа spray.io
Nikolay
Nikolay
Чёт не пойму
Nikolay
let processResponse (asyncResponse: Async<Result<Message, ApiResponseError>>) = async { match! asyncResponse with | Ok message -> printf "Message date: %s" (string message.Date) | Error e -> printf "%s " err.Description }
Nikolay
Убираю её - ошибок нет, добавляю - появляется в ней ошибка
gsomix
@Dolfik У тебя Error перекрылся.
Nikolay
Вот да
Nikolay
Result.Error ок
gsomix
@Dolfik Ну, ты не открывай целиком ExtCore.
Nikolay
Да это на слайде будет, так что пофиг)
Nikolay
Я вот что думаю, в F# обычные типы потокобезопасны?
Nikolay
И потокобезопасны ли CLIMutable типы
Éminence grise
безопасны все немутабельные типы. CLIMutable безопасны только пока ты не ушел из FSharp кода.
Nikolay
Ну по идее да, мы же не можем их изменить, только через рефлексию
Éminence grise
Records с немутабельными полями потокобезопасны. Туплы то же. List и Map. Все DU (условие - безопасность вложенных типов везде). CLIMutable говорит компилятору не допускать мутации в FSharp коде, но в любом другом - сколько угодно. В общем ничего нового, как и в CSharp