2008-10-07 4 views
114

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

+8

** Внимание: ** если вас интересует судьба этого вопрос, пожалуйста, присоединитесь к обсуждению [Переполнение метаданных] (http://meta.stackexchange.com/questions/131289/why-was-this-question-closed-f-and-ocaml/) или обсудите его в [чате ] (http://chat.stackoverflow.com/rooms/5/the-so-tavern-general) - комментарии здесь были необычайно непродуктивными, поэтому я их удалил. – Shog9 2012-05-03 22:01:01

+3

[Другое сравнение] (http://pauillac.inria.fr/~nakata/FSharp.html) с точки зрения разработчика OCaml, поэтому он довольно предвзятый, но полезный, тем не менее. – 2009-01-12 20:48:07

+1

@MauricioScheffer Неработающая ссылка! – 2012-05-04 09:37:32

ответ

79

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

  • Функторы
  • Объекты в стиле OCaml
  • полиморфные варианты
  • camlp4 препроцессора

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

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

Полный список различий: here (примечание: замена замененной мертвой ссылки).

2

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

+1

«F # поддерживает синтаксис OCaml напрямую. Он может быть не совместим на 100%, но я думаю, что он довольно близок». IME поддержка компилятора F # для совместимости OCaml очень затруднительна. Это может затруднить перенос существующих баз кода OCaml на F #, потому что компилятор F # внутренне умирает от действительного кода. – 2012-04-08 12:08:39

15

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

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

Однако, это все расширенные функции, и вы можете с уверенностью начать понимать основные идеи небольшого функционального программирования в стиле OCaml, используя ресурсы OCaml. Первым важным отличием, которое вы обнаружите, являются более масштабные проблемы, такие как инкапсуляция и абстракция, которые решаются совершенно по-разному в OCaml и F #. Если вы хотите узнать, как это сделать в F #, единственной доступной литературой является this article on purely functional data structures.

Я также обнаружил, что замечательная модульная система OCaml позволяет легко параметризовать типы кода (например, структуры данных), но альтернативы OOP не только отвратительны, но почти полностью не используются в .NET. Более того, при попытке написать элегантно-параметризованные структуры данных я ударил десятки ошибок в компиляторе F #, потому что никто даже не пытался сделать это раньше. F # stdlib действительно содержит некоторые хорошие реализации структуры данных, но практически не использует их повторно, т. Е. Это работа cut'n'paste.

8

F # и OCaml являются таксономическими классами в семействе языков ML, что также включает в себя целый палец других странных животных. F # новее, чем OCaml, и он не имеет ни функторов [функций модуля -> модуль], ни типов строк [классов объектов и полиморфных вариантов]. Между ними эти два упрощения, вероятно, облегчают процесс обучения для тех, кто развивается на платформе .NET.К сожалению, эти две особенности языка чрезвычайно эффективны в OCaml, поэтому чтение литературы OCaml для получения информации о том, как кодировать F #, вероятно, приведет к преждевременному разочарованию последнего, когда это, вероятно, отличная альтернатива C#, где оба доступны.

104

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

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

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

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