F # переходит на OCaml

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

Ответ 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 #, вероятно, приведет к преждевременному разочарованию последнего, когда это, вероятно, отличная альтернатива С#, где оба доступны.