Comments 11
Я правильно понимаю, что все это встроено в F# для поддержки библиотек из C#?
Только язык портить
Лучше бы в c# дали возможность писать функции без классов. Просто синт сахаром
Лучше бы в С# добавили алгебраические типы данных))
Ссылки все про generic math или я что-то упустил?
Я же имел ввиду Descriminated Unions.
Ну так бы сразу и говорили (впрочем, Вы так сразу и сказали - это я ступил). Ну на C# это уже пробовали эмулировать на record - но решение "такое себе" (наверное потому, что не использован ни генераторы, ни расширение компилятора Roslyn и всей ".net compiler platform sdk", включая надстройку для IDE; там в комментариях есть ссылка на другую разработку на generic types , и с применением генераторов; со стороны C# не хватает только анонимных типов в определениях, без создания экземпляров). Вопрос больше - а нафига вообще это в современном ООП, и в C# в частности? в F# это есть потому что это идёт от корней функционального программирования без ООП. В продвинутом ООП в этом нет большой надобности - тут есть классы, интерфейсы и наследования! Ну да - есть решения в некоторых ОО-ЯП, например в Scala - но это больше для галочки более глубокой поддержки функциональной парадигмы (у него была когда-то реализация и под .NET, а так под .NET был ещё Nemerle).
А в C# тут многое упирается в поддержку со стороны платформы .NET - но да, как-то же это сделали для F# (скорее всего опять же через классы и наследования, т.е. не для типов-значений - тут есть ограничения со стороны платформы)
Впрочем, если говорить об объединённых типах - то про желание иметь таковые в C# речь уже шла в обсуждениях развития данного ЯП - но пока воз и ныне там!
Чем статические функции не угодили? Класс там это просто синтаксический контейнер, модуль. Разницы никакой нет.
Ну и что бы это такого дало?
В C# класс - это не совсем синтаксический контейнер - это основная типообразующая сущность (вместе со структурой и интерфейсом, и кортежем), даже делегат - это тоже класс. Если не ошибаюсь, кроме классов типы образует только перечисление enum - вроде как классом не являющееся (на уровне платформы .NET), но... я наверное ошибаюсь - вроде там тоже можно и свойства вводить и методы - значит тоже класс! Это упрощает модель типов в C# (и в .NET)
В C# сейчас можно создавать проект без классов - с одними функциями - но это хорошо только для мелких примеров. На практике вряд ли кто-то этим активно пользуется.
Есть же статические функции и свойства!
В C# куда полезнее методика расширений классов дополнительными функциями - это стиль ООП!
А оператор usnig позволяет эффективно создавать псевдонимы длинным именам типов и вообще импортировать статические члены в текущий контекст - буду доступны а-ля глобальные функции и свойства! Чего Вам ещё нужно? (ну, может, наследования статических членов)
C# изначально заточен под ООП и потихоньку впитывает в себя функциональную парадигму.
А вот чего не хватает - это функций высшего порядка - лет 10 назад шли о них разговоры, года 3-4 назад даже "обещали" добавить - но их до сих пор нет. Конечно в C# есть делегаты - но они слишком тяжеловесны и неповоротливы - но, с учётом встроенной библиотеки стандартных типов, вполне себе позволяют программировать и без функций высшего порядка, тем более что поддержка анонимах функций и лямбда-синтаксис имеются!
В этом плане - ОО-ЯП Kotlin куда более перспективен в плане синтаксиса. Ему только не хватает поддержки мощи платформы .NET
Зато, в Kotlin есть мощь легковесных корутин для асинхронного программирования - вроде бы они позволяют создавать ещё более легковесный асинхронный код - чем async\await модель C#
В прочем в C# с асинхронностью всё не так уж плохо!
А ещё в C# есть LINQ - вот это вещь! Как раз построено на методике расширений!
Вот бы ещё макросы и макрофункции... и захват Unit-блока кода как в Kotlin, и инфиксные операторы...
Но скорее нужен просто Kotlin for Dot NET - и я его, кстати, сам разрабатываю...
RIP protected
ООП в F#