Как стать автором
Обновить

Комментарии 13

Большой авторитет (для меня) Дмитрий Сошников @shwars открыл мне глаза на F# пару лет назад, за что я ему безмерно благодарен (спасибо Дима!).
Действительно — было страшно начинать юзать нового зверя после 5++ лет шарпа. Не могу сказать, что врубился во все фичи, и в продуктах применять боюсь ещё, но уверен — применять буду.

По вашему личному впечатлению насколько язык «зрелый» в сравнении со Scala \ Kotlin?

И ещё несколько быстрых вопросов, если не сложно:
1. Что там с полиморфизмом (Как в Java? Интерфейсы? Что-то своё)?
2. Что там с иммутабельностью?
3. Достаточно ли мощный язык (система типов), чтобы реализовать «простые монады» Maybe \ Either?

К сожалению, ответить на ваш вопрос не могу. Это лишь перевод статьи, которая мне понравилась, так как F# использовал изредка и вступительное размышление очень близко пришлось

Полиморфизм — да! Всё что есть в C# и ещё больше. Например, есть возможность накладывать ограничения на структуру данных (наличие нужного метода/поля/свойства/оператора). Использовать не очень удобно — так вроде сделано умышленно, потому что функции с такими ограничениями не интеропятся с остальным .Net.

Иммутабельность — да! Автор допустил ошибку в переводе, let связывает имя со значением, а не создаёт переменную. Переменная у нас let mutable. По умолчанию всё иммутабельно.

Монады — вроде да. У нас алгебраические типы. Maybe есть в стдлибе, и называется Option. Монада Async реализована на самом F#, и является обыкновенным Computation Expression. Я не эксперт, но вроде до хаскеля в F# не хватает только тайпклассов. Слышал как эксперты говорили что не очень удобно работать со стеком монад — под каждый вариант приходится писать свой CU.
Сам я с трудом понимаю что такое монада, весь этот пункт может быть неправильным.

Про Scala\Kotlin ничего сказать не могу, так как слишком плохо с ними знаком.
Автор допустил ошибку в переводе, let связывает имя со значением, а не создаёт переменную

Извиняюсь, но не могли бы указать на это место?


Спасибо за уточнения!

let используется как var в C# — для объявления переменной

Я тоже не точно выразился, у автора там тоже слово «variable», что не истина. Перевод при этом корректен.
Спасибо.

Насколько я вас понял (по полиморфизму):
+ в F# есть «виртуальный полиморфизм» (ad hoc полиморфизм для гусаров теоретиков ЯП)

± в F# интерфейс может накладывать ограничения на данные, не только методы — не очень понял зачем, ну ок.

— в F# нет «позднего связывания» интерфейса с классом (ограничение «класс удовлетворяет интерфейсу» можно указать только в объявлении класса) — но оно мне не очень нужно, с радостью поменяю его на предыдущий пункт.

— в F# вроде бы нет аггрегирования/делегирования интерфейсов (subtype polymorphism для гусаров).
Т.е. нельзя написать:
class Human
{
private IIntegral age; // age — любой тип (ссылка на?) удовлетворяющий интерфейсу IIntegral
}
Но вроде бы этот пункт имеет глубокие противоречия с «виртуальным полиморфизмом» и никто не знает как хорошо их совместить.
ограничения на данные
Нет, можно накладывать ограничения на структуру данных. Собственно, структурная типизация. Но в основном пользуются номинативной.

нет «позднего связывания» интерфейса с классом
А есть примеры языков с реализацией такого? Я кажется не очень понимаю.

subtype polymorphism
Есть же. В некоторых местах нужно явно приводить к базовому классу, но это by design. Если в сигнатуре функции параметр имеет тип интерфейса или абстрактного класса — передать в неё можно любого наследника.
Спасибо.
Поддержка subtype polymorphism + «виртуальный (ad hoc) полиморфизм» выглядит интересно.

При этом при объявлении типов интер

А есть примеры языков с реализацией такого? Я кажется не очень понимаю.


Ну собственно в typeclass в Хаскель (я других не знаю) — там иерархия типов — это иерархия аггрегированных (вложенных друг в друга) данных. ВСЁ.
Иерархия интерфейсов отдельно.
«Прицепить API интерфейса к типу» вы можете в любой точке программы.
И у вас реально в двух разных модулях один и тот же тип может поддерживать два разных интерфейса.

ПС
По большому счёту наш «виртуальный полиморфизм» куда чаще нужен, ну во всяком случае мне для практических задач. Так что это не большая потеря.

вопрос к F# прогерам — чем же этот зверь лучше от C#? Чем выделяется на фоне других ЯП?

Вопрос "чем лучше", лучше перевести в "почему функциональное программирование популярно", так как C# смещен в стурону объектно-ориентированного, а F# как раз в функциональщину. И на этот вопрос, думаю, поможет ответить этот текст. Также, что-то можно увидеть в разделе "Сообщать об ошибке или контролировать выполнение программы" текущего текста.


По поводу выделения на фоне других, это можно также прочесть в данном тексте :)

Я бы ещё добавил, что Ф-шарп отличается не строгой но строжайшей типизацией, неявные приведения как бы невозможны. И мутабельность (если нужна) принудительная, так что мы всегда будем знать что объект не выкинет какую-нибудь дичь.

Ещё можно также отметить, что в F# Async<'t> — ленивый, в отличии от энергичного Task в C#

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.