Hog
Анна
вчера тут мне коллеги предложили разновидность дак тайпинга: "если ваш код выглядит как 💩, пахнет как 💩 ..."
Romɑn
Hog
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 Может инвертировать?
Nikolay
gsomix
Рассказать о том, почему Funogram — это круто.
Hog
а почему \ - _не_ функционально?
Nikolay
Éminence grise
18 слайд мне кажется лучше назвать некомбинируемо.
Nikolay
Идея была такая, я говорю, что есть .Net обёртка над апи, но она не очень подходит для F#, и дальше объясняю почему
Nikolay
Nikolay
Хз как слайд назвать
Vladislav
Чувак пришёл с кейсом этим
Vladislav
Vladislav
Éminence grise
Ну JSON.NET тоже в DU не умеет.
Éminence grise
Правда об этом вслух лучше не говорить 😊
Nikolay
Только вроде там достаточно топорно сделано
Vladislav
Éminence grise
Ну моя то же. Но из коробки нет. А биндер в интерфейс можно то же написать.
Vladislav
Вообщем чувак в том кейсе попробовал все
Vladislav
В итоге enum и object
Nikolay
É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
Romɑn
Romɑn
Romɑn
Vasily
На самом деле проще всего в виде строки- квотейшна по идее
Éminence grise
У меня кастомизируется на уровне типа сериализации или атрибутом, или рулом. Но к сожплению, пока выложить не могу - не договорился с начальством (в смысле не успел еще)
Éminence grise
Его еще должен JavaScript читать. И желательно, TypeScript то же понимать как DU
Nikolay
Кажется неплохая картинка про мутабельность)
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
Что смущает ппц
Romɑn
Кстати, поверх akka.tcp можно же сделать нормальный вебсервер типа spray.io
Romɑn
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
}
Romɑn
Nikolay
Убираю её - ошибок нет, добавляю - появляется в ней ошибка
gsomix
@Dolfik У тебя Error перекрылся.
Nikolay
Вот да
Nikolay
Result.Error ок
gsomix
@Dolfik Ну, ты не открывай целиком ExtCore.
Nikolay
Да это на слайде будет, так что пофиг)
Nikolay
Я вот что думаю, в F# обычные типы потокобезопасны?
Nikolay
И потокобезопасны ли CLIMutable типы
Vladislav
Éminence grise
безопасны все немутабельные типы. CLIMutable безопасны только пока ты не ушел из FSharp кода.
Nikolay
Nikolay
Ну по идее да, мы же не можем их изменить, только через рефлексию
Éminence grise
Records с немутабельными полями потокобезопасны. Туплы то же. List и Map. Все DU (условие - безопасность вложенных типов везде). CLIMutable говорит компилятору не допускать мутации в FSharp коде, но в любом другом - сколько угодно. В общем ничего нового, как и в CSharp