F # изменяется на OCaml [закрыто]

126

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

Эрик Форбс
источник
3
Еще одно сравнение с точки зрения разработчика OCaml, поэтому оно довольно необъективно, но, тем не менее, полезно.
Маурисио Схеффер,
8
Внимание: если вас интересует судьба этого вопроса, присоединяйтесь к обсуждению Meta Stack Overflow или обсуждайте его в чате - комментарии здесь были чрезвычайно непродуктивными, поэтому я их удалил.
Shog9
1
@MauricioScheffer Ссылка не работает!
JD
2
@JonHarrop Я думаю, что эта ссылка может быть обновленной. (Автор: Кейко Наката)
Барт

Ответы:

89

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

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

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

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

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

Крис Конвей
источник
3
Есть ли эквивалент camlp4 для F #?
nlucaroni
Не думаю. Но вы, вероятно, могли бы передать свою программу через camlp4 и в компилятор F #. (Не рекомендую.)
Крис Конвей,
6
У F # есть именованные и необязательные аргументы, но он использует другой синтаксис и семантику. У вас возникнут проблемы с использованием Camlp4 с F #, потому что F # почти всегда чувствителен к отступам, поэтому ему потребуется новый лексер, а документация Camlp4 по лексерам оставалась ненаписанной в течение почти двух лет.
JD
4
А теперь ссылка мертва. Полагаю, это, наверное, хорошо. Я уверен, что F # улучшился с '08.
1
Я где-то слышал, что Microsoft не хотела добавлять в F # функциональность, подобную camlp4, потому что они беспокоились, что такая функциональность может побудить людей начать использовать среду разработки, отличную от Microsoft Visual Studio.
chrismamo1
118

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

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

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

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

Томаш Петричек
источник
18
Ого! OCaml был специально создан для метапрограммирования, и в этом контексте он значительно превосходит F # и .NET. Camlp4 - гораздо более мощная система котировок, чем F #. Лексеры и парсеры OCaml намного лучше, чем все, что доступно для .NET. Также доступны макросы Camlp4, реализующие активные шаблоны и выражения вычислений. OCaml также имеет IDE, которые предоставляют те же преимущества, что и Visual Studio для F #.
JD
4
Цитаты F # преследуют совершенно другую цель, чем то, что доступно в Camlp4 (кроме того, это не язык OCaml - это система поверх него), поэтому сравнивать их нечестно. Существование Camlp4, безусловно, является преимуществом OCaml, но это не имеет ничего общего с цитатами (которые позволяют такие вещи, как WebSharper, запуск F # на GPU и т. Д.)
Томас Петричек
12
@Tomas: Как вы согласовываете свое утверждение, что Camlp4 "является системой поверх" OCaml, когда Camlp4 интегрирован с OCaml на двоичном уровне, а макросы Camlp4 могут быть определены и использованы на лету в работающем OCaml REPL? Как вы согласовываете свое утверждение о том, что Camlp4 «не имеет ничего общего с цитатами», с тем фактом, что Camlp4 предоставляет механизм цитаты? Как вы согласитесь со своим мнением о том, что Camlp4 не может облегчить работу подобных Websharper, когда инструмент SkyDeck ocamljs компилирует код OCaml, цитируемый с использованием Camlp4, в Javascript с 2007 года?
JD
6
@Tomas: F # не может даже заключать в кавычки выражения с несвязанными переменными, например <@ a @>, не говоря уже об определениях типов, <@ type t = int @>и не может обрабатывать произвольные грамматики , не говоря уже о расширяемых лексерах и синтаксических анализаторах, как Camlp4. Отсутствие достойной макросистемы - это один из недостатков, но, IMHO, отсутствие каких-либо достойных лексеров и парсеров для F # - гораздо более серьезное препятствие. На самом деле я советую разработчикам создавать свои лексические анализаторы и анализаторы с использованием OCaml, ограничивая себя подмножеством, поддерживаемым F #, и переносить его обратно на F #, чтобы воспользоваться преимуществами превосходной поддержки инструментов OCaml!
JD
8
@Erik: «Большинство людей сосредотачиваются на том, чего не хватает в F #, но я также хотел увидеть, чего не хватает в OCaml». Обратите внимание, что активные шаблоны, метапрограммирование, выражения вычислений и асинхронные рабочие процессы были доступны в OCaml до того, как они вошли в F #.
JD
16

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

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

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

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

JD
источник
28
Все ссылки требуют платной подписки.
2
@ Будут ли они казаться бессовестной пробкой для того, что Джон Харроп написал сам (он каждый раз указан как автор)
симбионт
@symbiont Да, мы знаем, что это немного спам. Было бы неплохо, если бы вы связались с дополнительной информацией, которая была бесплатной. Но без ссылок ответ будет прекрасен, так что вот вам.
@Will было бы неплохо, если бы вы сами связали дополнительную информацию
симбионт
@symbiont Я имел в виду Джона, а не тебя, когда сказал «ты». Звучит странно, читать это. Не уверен, что Джон удалил межстраничный комментарий. Как бы то ни было, вот вам: Meta Stack Exchange
9

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

Джеймс Вудятт
источник
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 # умирает внутри корректного кода.
JD
Все ссылки мертвы.
Wingjam 02