F # получен из OCaml, но какие основные элементы отсутствуют или добавлены? В частности, мне любопытно, доступны ли ресурсы для обучения OCaml тем, кто хочет узнать F #.
F # переходит на OCaml
Ответ 1
Основные отличия в том, что F # не поддерживает:
- функторы
- Объекты стиля OCaml
- полиморфные варианты
- препроцессор camlp4
Кроме того, F # имеет другой синтаксис для помеченных и необязательных параметров.
Теоретически программы OCaml, которые не используют эти функции, могут быть скомпилированы с помощью F #. Изучение OCaml - это совершенно разумное введение в F # (и наоборот, я думаю).
Полный список различий здесь (примечание: замена мертвой ссылки archive.org).
Ответ 2
Этот вопрос был дан ответ в течение некоторого времени, но я был очень удивлен, что большинство ответов говорят о том, что функции 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.
Ответ 3
Я всегда описываю F # как двоюродный брат OCaml, потому что OCaml имеет много функций, которые F # не имеет и никогда не сможет получить. F # более тесно связан с предыдущим языком CAML. В частности, F # имеет очень ограниченную поддержку абстракции и не поддерживает структурную типизацию (например, OCaml объекты и полиморфные варианты).
В отличие от того, что написано некоторыми респондентами, F # имеет (ограниченную) поддержку помеченных ( "named" ) и необязательных аргументов.
Однако, это все расширенные функции, и вы можете с уверенностью начать понимать основные идеи небольшого функционального программирования в стиле OCaml, используя ресурсы о OCaml. Первым важным отличием, которое вы обнаружите, являются более масштабные проблемы, такие как инкапсуляция и абстракция, которые решаются совершенно по-разному в OCaml и F #. Если вы хотите узнать, как это сделать в F #, единственной доступной литературой является эта статья о чисто функциональных структурах данных.
Я также обнаружил, что замечательная модульная система OCaml позволяет легко параметризовать типы кода (например, структуры данных), но альтернативы OOP не только отвратительны, но и почти полностью не используются в .NET. Более того, при попытке написать элегантно-параметризованные структуры данных я ударил десятки ошибок в компиляторе F #, потому что никто даже не пытался сделать это раньше. F # stdlib содержит некоторые хорошие реализаций структуры данных, но практически не использует их повторно, то есть это задание cut'n'paste.
Ответ 4
F # и OCaml являются таксономическими классами в семействе языков ML, что также включает в себя целый палец других странных животных. F # новее, чем OCaml, и он не имеет ни функторов [функций модуля → модуль], ни типов строк [классов объектов и полиморфных вариантов]. Между ними эти два упрощения, вероятно, облегчают процесс обучения для тех, кто развивается на платформе .NET. К сожалению, эти две языковые функции чрезвычайно эффективны в OCaml, поэтому чтение литературы OCaml для получения информации о том, как кодировать F #, вероятно, приведет к преждевременному разочарованию последнего, когда это, вероятно, отличная альтернатива С#, где оба доступны.
Ответ 5
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