F # происходит от OCaml, но какие основные элементы отсутствуют или добавлены? В частности, мне любопытно, полезны ли ресурсы, доступные для изучения OCaml, для тех, кто хочет изучить F #.
F # происходит от OCaml, но какие основные элементы отсутствуют или добавлены? В частности, мне любопытно, полезны ли ресурсы, доступные для изучения OCaml, для тех, кто хочет изучить F #.
Ответы:
Основные отличия заключаются в том, что F # не поддерживает:
Кроме того, F # имеет другой синтаксис для помеченных и необязательных параметров.
Теоретически программы OCaml, которые не используют эти возможности, могут быть скомпилированы с помощью F #. Изучение OCaml - вполне разумное введение в F # (и, как мне кажется, наоборот).
Полный список отличий находится здесь (примечание: archive.org замена мертвой ссылки).
На этот вопрос в течение некоторого времени был дан ответ, но я был весьма удивлен, что в большинстве ответов говорится, какие функции OCaml отсутствуют в F # - это определенно полезно знать, если вы хотите перенести существующие программы OCaml на F # (что, вероятно, является мотивация большинства упомянутых статей). Однако есть много функций, которые делают F # другим языком (а не только ограниченной версией OCaml для .NET!). В F # добавлено несколько вещей:
+
для всех числовых типов, а также для тех типов, которые его поддерживают.И, честно говоря, я считаю, что также стоит упомянуть о Visual Studio IDE. Это не часть языка, но действительно улучшает взаимодействие с пользователем (поддержка IntelliSense в Visual Studio действительно хороша!)
Если вы посмотрите на список, то увидите, что многие вещи во многом способствовали популярности F #, так что это гораздо больше, чем просто «OCaml без функторов». F # определенно основан на OCaml (и заимствует идеи из других языков, таких как Haskell) и имеет много общего с ними, однако есть и много других вещей. Я предполагаю, что без таких вещей, как асинхронные рабочие процессы, объектно-ориентированное программирование в стиле .NET и метапрограммирование, Microsoft Developer Division никогда бы не включил F # в Visual Studio 2010.
<@ a @>
, не говоря уже об определениях типов, <@ type t = int @>
и не может обрабатывать произвольные грамматики , не говоря уже о расширяемых лексерах и синтаксических анализаторах, как Camlp4. Отсутствие достойной макросистемы - это один из недостатков, но, IMHO, отсутствие каких-либо достойных лексеров и парсеров для F # - гораздо более серьезное препятствие. На самом деле я советую разработчикам создавать свои лексические анализаторы и анализаторы с использованием OCaml, ограничивая себя подмножеством, поддерживаемым F #, и переносить его обратно на F #, чтобы воспользоваться преимуществами превосходной поддержки инструментов OCaml!
Я всегда описываю 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