F# меняется на OCaml
F# происходит от OCaml, но какие основные элементы отсутствуют или добавлены? В частности, мне любопытно, полезны ли ресурсы, доступные для изучения OCaml, тем, кто хочет изучать F#.
5 ответов
Основные отличия в том, что F# не поддерживает:
- функторы
- Объекты в стиле OCaml
- полиморфные варианты
- препроцессор camlp4/5 или точки расширения (ppx)
Кроме того, F# имеет другой синтаксис для помеченных и необязательных параметров.
Теоретически, программы OCaml, которые не используют эти функции, могут быть скомпилированы с помощью F#. Изучение OCaml является вполне разумным введением в F# (и наоборот, я бы вообразил).
Полный список различий находится здесь (примечание: archive.org замена неработающей ссылки).
В течение некоторого времени на этот вопрос уже был дан ответ, но я был весьма удивлен, что в большинстве ответов говорится о том, чего не хватает в OCaml в F# - это, безусловно, полезно знать, если вы хотите портировать существующие программы OCaml в F# (что, вероятно, является мотивация большинства цитируемых статей). Тем не менее, есть много функций, которые делают F# другим языком (не только ограниченная версия OCaml для.NET!) Вот несколько вещей, которые добавлены в F#:
- Единицы измерения, которые позволяют проверять код, связанный с числовыми вычислениями.
- Мета-программирование с использованием цитат (что позволяет использовать LINQ в F# и также важно для перспективных проектов, таких как платформа WebSharper)
- Активные шаблоны для создания абстракций для функциональных типов данных (и вообще очень полезная функция для более сложных приложений сопоставления с образцами)
- Вычислительные выражения, являющиеся языковой особенностью асинхронных рабочих процессов (библиотека для асинхронного ввода-вывода / веб-службы / программирования GUI)
- Совместимая с.NET объектная система, позволяющая полностью взаимодействовать с платформой.NET (OCaml также поддерживает объекты, но отличается - в обеих системах, конечно, есть некоторые преимущества).
- Перегруженные операторы - насколько я знаю, в OCaml нет перегруженных операторов - в F# вы можете использовать
+
для всех числовых типов, а также для ваших типов, которые его поддерживают.
И, если честно, я думаю, что стоит упомянуть и о Visual Studio IDE. Это не часть языка, но это действительно улучшает взаимодействие с пользователем (поддержка IntelliSense в Visual Studio действительно хороша!)
Если вы посмотрите на список, есть много вещей, которые во многом способствовали популярности F#, так что это гораздо больше, чем просто "OCaml без функторов". F# определенно основан на OCaml (и берет идеи из других языков, таких как Haskell) и делится с ними многими аспектами, однако есть и много других вещей. Я предполагаю, что без таких вещей, как асинхронные рабочие процессы, OO в стиле.NET и метапрограммирование, отдел разработчиков Microsoft никогда бы не включил F# в Visual Studio 2010.
Я всегда описываю F# как двоюродного брата OCaml, потому что у OCaml есть много функций, которых нет у F# и вряд ли они получат. F# более тесно связан с предыдущим языком CAML. В частности, F# имеет очень ограниченную поддержку абстракции и вообще не поддерживает структурную типизацию (например, объекты OCaml и полиморфные варианты).
Вопреки тому, что написали некоторые респонденты, F# имеет (ограниченную) поддержку помеченных ("именованных") и необязательных аргументов.
Тем не менее, это все расширенные функции, и вы, безусловно, можете начать понимать основные идеи, стоящие за мелкомасштабным функциональным программированием в стиле OCaml, используя ресурсы об OCaml. Первое существенное отличие, которое вы обнаружите, - это более масштабные проблемы, такие как инкапсуляция и абстракция, которые решаются совершенно разными способами в OCaml и в F#. Если вы хотите узнать, как это сделать в F#, единственная доступная литература - это статья о чисто функциональных структурах данных.
Я также обнаружил, что замечательная модульная система OCaml позволяет легко параметризовать код по типам (таким как структуры данных), но альтернативы ООП не только отвратительны, но и почти полностью не используются в.NET. Более того, при попытке написать элегантно параметризованные структуры данных я обнаружил десятки ошибок в компиляторе F#, потому что никто даже не пытался сделать это раньше. F# stdlib действительно содержит несколько хороших реализаций структуры данных, но практически не используется повторно, то есть это работа по вырезке и вставке.
F# и OCaml являются таксономически классами в семействе языков ML, которое включает в себя целый ряд других странных животных. F# новее, чем OCaml, и у него пока нет ни функторов [функций модуля -> модуля], ни типов строк [классов объектов и полиморфных вариантов]. Между ними эти два упрощения, вероятно, облегчают процесс обучения для тех, кто разрабатывает на платформе.Net. К сожалению, эти две возможности языка чрезвычайно мощны в OCaml, поэтому чтение литературы по OCaml для получения понимания того, как кодировать для F#, вероятно, приведет к преждевременному разочарованию последней, когда это, вероятно, отличная альтернатива C#, где оба доступны.
F# поддерживает синтаксис OCaml напрямую. Это может быть не на 100% совместимо, но я думаю, что это довольно близко.
http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html
Вот список отличий (не уверен, насколько он актуален)
http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html