Ayrat
Тоже так хочу в фшарпе
Vladimir
а как это будет выглядеть? что то не оч понимаю
Ayrat
При этом всякие
(string | null) | (int | null) | (double)
Будут правильно схлопываться до (string | int | double | null) и тип (double | null) будет валидным для входа в эту функцию
Ayrat
Так как компилятор может доказать что он подтип
Ayrat
Vladimir
Ayrat
Ayrat
Поэтому у нас не сработает никак
Vladimir
понятно) а & как работает?
Ayrat
Vladimir
нужен пример)
Ayrat
Ок. Int && IComparable
Ayrat
Это тип пересечение
Ayrat
В ООП реализован через наследование
Vladimir
но это же невалидное пересечение?
Ayrat
Ayrat
Любое пересечение валидно
Vladimir
аа, понял кажется, пересечение имеет смысло когда есть юнион типы
Ivan
у входного объекта дернут какой-нибудь ToString() - вот и профит
Ayrat
Ayrat
Короче, это прям киллер фича. Чот я прям даже подумал скалу 3 попробовать
Ivan
Ayrat
Но ты прав, без инстанса такого типа ничего не выйдет
Ayrat
Ты можешь объявить функцию принимающую Void, как её вызовут уже не твоя проблема
Vladimir
а, ну пересечение же есть у нас
Vladimir
where T: IEnumerable, IComparable
Vladimir
а в фшарпе кстати не уверен как такое написать
Ayrat
То есть да, у пересечения Int и Comparable может не быть инстансов.
И если Int уже объявлен, то вроде бы конец.
Но тайп класс может создать инстанс такого типа
Ayrat
Vladimir
у нас можно #ienumerable
Ayrat
У своих типов
Ayrat
Старым ты его не докинешь
Vladimir
что возможно и хорошо (во многих случаях)
Ayrat
То есть в теории ты можешь объявить функцию с типом Guid && IEnumerable, но гуид не реализует этот интерфейс.
Тут только тайпклассы спасут
Ayrat
Сайм активно пилит глобальную видимость тайп экстеншнов
Vladimir
сртп тоже старым ничего не докидывает
Ayrat
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
Ayrat
Первый особенно
Ayrat
Сртп смогут видеть тайп экстеншны
Ayrat
Это типа возможность через дак тайпинг докинуть готовым типам функциональность интерфейсов и через сртп их вызывать
Ayrat
type Int32 with
member _.Dispose() = ()
let dispose (x: ^x when (^x: member Dispose: unit -> unit)) = ...
dispose 1
Ayrat
При этом тайп экстеншн может быть в другой сборке
Vladimir
Danil
Vladimir
Вот два PR
останется синтаксис вызова нормальным сделать
Ayrat
Ayrat
Ayrat
Сейчас не работает. Ну то есть тайп экстеншн работает, но сртп его не видит
Vasily
Если это введут, жизнь сильно упростится
Vladimir
у нас можно #ienumerable
сча проверил, только один такой flexible тип можно написать, нельзя написать два :( flexble оказывается не такие и flexible
Vladimir
а, ну все не так плохо) сумму нельзя написать, но она автоматом может вывестись
Vladimir
тут как я понимаю даже если захочешь параметру f типа написать не сможешь)
Vladimir
Vladimir
@omgszer вот короче твой &, а | я так понимаю от DU отличается только что на одно слово меньше писать при передаче
Ayrat
Ayrat
Du от двух стрингов это два разных типа стринга
А юнион string | string === string
Ayrat
Это НЕ размеченные объединения
Ayrat
А в фшарпе только размеченные
Vladimir
понял)
Vladimir
ну кстати если вот тут and на or поменять, то и будет то что нужно) а как я помню в компиляторе это есть
Андрей
Anatoly
@omgszer а есть хороший курс на udemy/курсере по скале? Подчинённые спрашивают
Danil
Скиньте фул, друг просит
Ayrat
Андрей
на курсере есть целый набор курсов от папы одерского, в свое время сподвигли сменить работу
Ayrat
Ayrat
Ругань по делу, а не по синтаксису
Ayrat
А по делу я ругаю имплиситы, макросы, сбт, брекинг ченжи, ебанутую экосистему заточенную на хипстеров
С этим мне бы курсы не помогли
Андрей
ну вот да, когда уже есть f# в голове, то доп знаний гораздо меньше, и кажется все и так ок, разве что синтакс бесит