Вопрос

F # является производным от OCaml, но какие основные элементы отсутствуют или добавлены?В частности, мне любопытно, полезны ли ресурсы, доступные для изучения OCaml, также тем, кто хочет изучить F #.

Это было полезно?

Решение

Основные отличия заключаются в том, что F # не поддерживает:

  • функторы
  • Объекты в стиле OCaml
  • полиморфные варианты
  • препроцессор camlp4/5 или точки расширения (ppx)

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

Теоретически программы OCaml, которые не используют эти функции, могут быть скомпилированы с помощью F #.Изучение OCaml - вполне разумное введение в F # (и наоборот, я бы предположил).

Полный список отличий таков здесь (примечание:archive.org замена нерабочего звена).

Другие советы

На этот вопрос уже некоторое время дан ответ, но я был весьма удивлен, что в большинстве ответов говорится, каких функций OCaml не хватает в F # - это определенно полезно знать, если вы хотите портировать существующие программы OCaml на F # (что, вероятно, является мотивацией большинства статей, на которые даны ссылки).Однако существует множество функций, которые делают F # другим языком (а не просто ограниченной версией OCaml для .NET!) Вот пара вещей, которые добавлены в F#:

  • Единицы измерения которые позволяют вам проверять код, имеющий дело с числовыми вычислениями
  • Метапрограммирование использование цитат (что позволяет использовать LINQ в F #, а также важно для перспективных проектов, таких как платформа WebSharper)
  • Активные паттерны для создания абстракций для функциональных типов данных (и, как правило, очень полезная функция для более сложных приложений сопоставления с образцом)
  • Вычислительные выражения что является языковой особенностью, стоящей за асинхронные рабочие процессы (библиотека для асинхронного ввода-вывода / веб-сервиса / программирования с графическим интерфейсом)
  • .NET-совместимая объектная система это позволяет полностью взаимодействовать с платформой .NET (в OCaml также есть поддержка объектов, но другая - конечно, в обеих системах есть некоторые преимущества).
  • Перегруженные операторы - Насколько я знаю, OCaml не имеет перегруженных операторов - в F # вы можете использовать + для всех числовых типов, а также для ваших типов, которые их поддерживают.

И, честно говоря, я думаю, что также стоит упомянуть IDE Visual Studio.Это не является частью языка, но это действительно улучшает работу пользователя (поддержка IntelliSense в Visual Studio действительно хороша!)

Если вы посмотрите на список, то увидите много вещей, которые в значительной степени способствовали популярности F #, так что это гораздо больше, чем просто "OCaml без функторов".F # определенно основан на OCaml (и заимствует идеи из других языков, таких как Haskell) и разделяет с ними многие аспекты, однако есть также много других вещей.Я предполагаю, что без таких вещей, как асинхронные рабочие процессы, OO в стиле .NET и метапрограммирование, подразделение разработчиков Microsoft никогда бы не включило F # в Visual Studio 2010.

Я всегда описываю F # как двоюродного брата OCaml, потому что у OCaml есть много функций, которых нет у F # и вряд ли они получат. F # более тесно связан с предыдущим языком CAML. В частности, F # имеет очень ограниченную поддержку абстракции и не поддерживает структурную типизацию (например, объекты и полиморфные варианты ) вообще.

Вопреки тому, что написали некоторые респонденты, 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/ ~ Шох / FSharp / html / index.html

Вот список отличий (не уверен, насколько он актуален)

http: //plus.kaist. ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top