F# изменения в OCaml [закрыты]
Вопрос
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 р>