Много раз я слышал, что F # не подходит для конкретных задач, таких как UI. «Используйте правильный инструмент» - это обычная фраза.
Помимо отсутствующих инструментов, таких как конструктор WinForms / WPF / ORM, я не уверен, что именно отсутствует в F # - честно говоря! Тем не менее, особенно с пользовательским интерфейсом, мне сказали, что C # просто делает это лучше. Итак, каковы фактические различия и упущения в F # при его императивном использовании?
Вот список, который я составил:
Отсутствует поддержка инструментов
F # все еще находится в стадии бета-тестирования
Ваши разработчики не знают F #
- I'd like to not consider those points, as they aren't really intrinsic to F#
Изменяемые должны быть "изменяемыми" или должны быть ref, ref need! разыменовать
Изменяемые значения назначаются с помощью ‹- и ref использует: = (они оба на 1 символ больше, чем просто =)
val требуется атрибут DefaultValueAttribute, чтобы получить значение по умолчанию
F # не генерирует неявные интерфейсы
С защищенными членами сложнее иметь дело
Нет автоматических свойств
Реализованные виртуальные члены в абстрактных классах требуют двух определений
Quotations-to-LINQ-Expression-Trees создает деревья, немного отличающиеся от C # / VB (раздражает API-интерфейсы, которые ожидают свои выражения в определенном формате)
Нет stackalloc
В F # нет условного оператора?:
Указатели могут считаться более громоздкими в F #
Делегаты / мероприятия, возможно, могут считаться более громоздкими (я бы сказал, что они проще, но как минимум они разные)
Нет автоматического преобразования типов (например, int в float или неявного приведения типов)
Нет специальной поддержки синтаксиса для значений Nullable (аннотация типа? И оператор в C #, а также использование операторов для значений NULL).
Нет автоматического повышения до общего базового класса или бокса (например: let x: obj = if true then 1 else "hi" // проверка типов не выполняется)
Значения не могут быть отброшены без предупреждения ("игнорируйте", чтобы обойти это)
Не имеет синтаксиса в стиле C :)
На вопрос: что из этого мешает написанию императивного или объектно-ориентированного кода? Почему (короткие примеры)? Какие из них я пропустил? Каковы лучшие обходные пути и почему их недостаточно?
Обратите внимание, я не говорю о написании так называемого идиоматического F # и уж точно не говорю о функциональном программировании. Меня больше интересует следующий вопрос: «Если бы я заставил себя написать пользовательский интерфейс или императивный / объектно-ориентированный код на F #, используя F # OO / императивные функции и типы классов, что больше всего повредит?»
Бонус. Если вы не знаете F #, но используете C # или VB.NET и считаете, что это лучший инструмент для некоторых ситуаций, укажите конкретные языковые функции и синтаксис, которые вам нравятся.