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

Другие вопросы по тегам