Ayrat
Тоже так хочу в фшарпе
Vladimir
а как это будет выглядеть? что то не оч понимаю
Ayrat
а как это будет выглядеть? что то не оч понимаю
def parse(a : String | Uuid): Int =... parse("..") parse(Uuid.new)
Ayrat
При этом всякие (string | null) | (int | null) | (double) Будут правильно схлопываться до (string | int | double | null) и тип (double | null) будет валидным для входа в эту функцию
Ayrat
Так как компилятор может доказать что он подтип
Ayrat
а как это будет выглядеть? что то не оч понимаю
Это же мечта алгебраических типов
Vladimir
def parse(a : String | Uuid): Int =... parse("..") parse(Uuid.new)
вот это вроде понятно) но у нас же type X = | A of string | B of string
Ayrat
Поэтому у нас не сработает никак
Vladimir
понятно) а & как работает?
Ayrat
понятно) а & как работает?
Как тип пересечение
Vladimir
нужен пример)
Ayrat
Ок. Int && IComparable
Ayrat
Это тип пересечение
Ayrat
В ООП реализован через наследование
Vladimir
но это же невалидное пересечение?
Ayrat
Любое пересечение валидно
Vladimir
аа, понял кажется, пересечение имеет смысло когда есть юнион типы
Ivan
у входного объекта дернут какой-нибудь ToString() - вот и профит
Ayrat
Короче, это прям киллер фича. Чот я прям даже подумал скалу 3 попробовать
Vladimir
Чо бы это?
тем что оно пустое)
Ayrat
тем что оно пустое)
Это проблема вызывающей стороны
Ayrat
Но ты прав, без инстанса такого типа ничего не выйдет
Ayrat
Ты можешь объявить функцию принимающую Void, как её вызовут уже не твоя проблема
Vladimir
а, ну пересечение же есть у нас
Vladimir
where T: IEnumerable, IComparable
Vladimir
а в фшарпе кстати не уверен как такое написать
Ayrat
То есть да, у пересечения Int и Comparable может не быть инстансов. И если Int уже объявлен, то вроде бы конец. Но тайп класс может создать инстанс такого типа
Ayrat
а в фшарпе кстати не уверен как такое написать
Опять же никак, нет тайпклассов
Vladimir
у нас можно #ienumerable
Ayrat
У своих типов
Ayrat
Старым ты его не докинешь
Vladimir
что возможно и хорошо (во многих случаях)
Ayrat
То есть в теории ты можешь объявить функцию с типом Guid && IEnumerable, но гуид не реализует этот интерфейс. Тут только тайпклассы спасут
Ayrat
что возможно и хорошо (во многих случаях)
Тайпклассы это тоже очень круто. Но их уже почти ввели в фшарп через сртп
Ayrat
Сайм активно пилит глобальную видимость тайп экстеншнов
Vladimir
сртп тоже старым ничего не докидывает
Ayrat
А будет
Vladimir
О_о
Ayrat
[RFC FS-1043] Extension members visible to trait constraints · Issue #6805 · dotnet/fsharp https://github.com/dotnet/fsharp/pull/6805
Ayrat
[RFC FS-1071] Witnesses passing for trait-constraints w.r.t. quotations · Issue #6810 · dotnet/fsharp https://github.com/dotnet/fsharp/pull/6810
Ayrat
О_о
Вот два PR
Ayrat
Первый особенно
Ayrat
Сртп смогут видеть тайп экстеншны
Ayrat
Это типа возможность через дак тайпинг докинуть готовым типам функциональность интерфейсов и через сртп их вызывать
Ayrat
type Int32 with member _.Dispose() = () let dispose (x: ^x when (^x: member Dispose: unit -> unit)) = ... dispose 1
Ayrat
При этом тайп экстеншн может быть в другой сборке
Vladimir
Vladimir
Вот два PR
останется синтаксис вызова нормальным сделать
Ayrat
Сейчас не работает. Ну то есть тайп экстеншн работает, но сртп его не видит
Vasily
Если это введут, жизнь сильно упростится
Vladimir
у нас можно #ienumerable
сча проверил, только один такой flexible тип можно написать, нельзя написать два :( flexble оказывается не такие и flexible
Vladimir
а, ну все не так плохо) сумму нельзя написать, но она автоматом может вывестись
Vladimir
тут как я понимаю даже если захочешь параметру f типа написать не сможешь)
Vladimir
а нет, все-тки можно
Vladimir
@omgszer вот короче твой &, а | я так понимаю от DU отличается только что на одно слово меньше писать при передаче
Ayrat
Du от двух стрингов это два разных типа стринга А юнион string | string === string
Ayrat
Это НЕ размеченные объединения
Ayrat
А в фшарпе только размеченные
Vladimir
понял)
Vladimir
а нет, все-тки можно
ну кстати если вот тут and на or поменять, то и будет то что нужно) а как я помню в компиляторе это есть
Андрей
Если это введут, жизнь сильно упростится
откроется люк в астро-жизнь ))
Андрей
@omgszer вот короче твой &, а | я так понимаю от DU отличается только что на одно слово меньше писать при передаче
Оно есть уже в typescript. отличается тем, что ты свободен добавлять кейсы по своему усмотрению, не расширяя DU. Но область применения не бесконечна конеш
Anatoly
@omgszer а есть хороший курс на udemy/курсере по скале? Подчинённые спрашивают
Danil
Скиньте фул, друг просит
Андрей
на курсере есть целый набор курсов от папы одерского, в свое время сподвигли сменить работу
Андрей
Не знаю, я на learnXinYminutes.com проходил
вот если б напрягся и пролистал первый курс хотя бы, то ругани в сторону скалы было б меньше ))
Ayrat
Ругань по делу, а не по синтаксису
Ayrat
А по делу я ругаю имплиситы, макросы, сбт, брекинг ченжи, ебанутую экосистему заточенную на хипстеров С этим мне бы курсы не помогли
Андрей
ну вот да, когда уже есть f# в голове, то доп знаний гораздо меньше, и кажется все и так ок, разве что синтакс бесит