Должен ли я изучать Haskell или F#, если я уже знаю OCaml?

Мне интересно, стоит ли мне продолжать изучать OCaml или перейти на F# или Haskell.

Вот критерии, которые меня больше всего интересуют:

  • долголетие

    • Какой язык будет длиться дольше? Я не хочу изучать то, что может быть оставлено через пару лет пользователями и разработчиками.
    • Будет ли Inria, Microsoft, University of Glasgow и в дальнейшем поддерживать соответствующие компиляторы?
  • практицизм

    • Такие статьи заставляют меня бояться использовать Haskell. Хеш-таблица - лучшая структура для быстрого поиска. Сторонники Haskell предлагают использовать Data.Map, представляющий собой двоичное дерево.
    • Мне не нравится быть привязанным к громоздкой платформе.NET, если ее преимущества не велики.
    • Я хочу иметь возможность разрабатывать больше, чем просто парсеры и математические программы.
  • Хорошо разработан

    • Мне нравится, чтобы мои языки были последовательными.

Пожалуйста, поддержите ваше мнение логическими аргументами и цитатами из статей. Спасибо.

8 ответов

Решение

долголетие

  • Хаскель де-факто является доминирующим языком исследования функционального программирования. Haskell 98 прослужит еще много лет в стабильной форме, а то, что называется Haskell, может длиться от 10 до 30 лет - хотя язык будет продолжать развиваться. Сообщество вкладывает большие средства в Haskell, и даже если завтра основные разработчики GHC столкнутся с автобусом (известная проблема "ошибка шины в Кембридже"), есть множество других, которые могут подойти к делу. Есть и другие, менее сложные компиляторы.

  • Caml контролируется небольшой группой французской национальной лаборатории INRIA. Они также имеют значительные инвестиции, другие также вкладываются в Caml, и код имеет открытый исходный код, и компилятор не слишком сложен, так что он будет поддерживаться в течение длительного времени. Я предсказываю, что Caml будет гораздо более стабильным, чем Haskell, так как кажется, что люди INRIA больше не используют его как средство для изучения новых языковых идей (или, по крайней мере, они делают это с меньшей скоростью, чем в прошлом).

  • Кто знает, что будет делать компания? Если F# будет успешным, Microsoft может поддержать его в течение 20 лет. Если это не удастся, они могут отключить в 2012 году. Я не могу догадаться и не буду пытаться.

практицизм

Хеш-таблица - лучшая структура для быстрого поиска. Сторонники Haskell предлагают использовать Data.Map, представляющий собой двоичное дерево.

Это зависит от того, что вы ищете. Когда ваши ключи являются строками, троичные деревья поиска часто работают быстрее, чем хеш-таблицы. Когда ваши ключи целые, двоичные деревья Патриции Окасаки и Джилла конкурируют с хешированием. Если вы действительно этого хотите, вы можете создать хэш-таблицу в Haskell, используя монаду ввода-вывода, но в этом нет необходимости.

Я думаю, что всегда будет снижение производительности за ленивую оценку. Но "практический" - это не то же самое, что "как можно быстрее". Следующее верно в отношении производительности:

  • Проще всего предсказать время и пространство поведения программы Caml.

  • F# находится посередине (кто действительно знает, что будут делать.NET и JIT?).

  • Сложнее всего предсказать время и пространственное поведение программ на Haskell.

  • У Haskell есть лучшие инструменты для профилирования, и в конечном итоге это то, что дает лучшую производительность.

Я хочу иметь возможность разрабатывать больше, чем просто парсеры и математические программы.

Чтобы узнать о возможностях в Haskell, ознакомьтесь с оконным менеджером xmonad и множеством пакетов по адресу hackage.haskell.org,

Мне не нравится быть привязанным к громоздкой платформе.NET, если ее преимущества не велики.

Я не могу комментировать:

Хорошо разработан

Мне нравится, чтобы мои языки были последовательными.

Некоторые моменты, по которым нужно оценить последовательность:

  • Конкретный синтаксис Хаскелла очень хорошо разработан; Я постоянно впечатлен хорошей работой комитета Хаскелла. Синтаксис OCaml в порядке, но страдает от сравнения. F# начинался с синтаксиса ядра Caml и имеет много общего.

  • У Haskell и OCaml есть очень последовательные истории о перегрузке операторов. У Haskell есть последовательный и мощный механизм, который вы можете расширить сами. OCaml не имеет никаких перегрузок.

  • OCaml имеет простейшую систему типов, особенно если вы не пишете объекты и функторы (чего не делают многие программисты Caml, хотя мне кажется безумным не писать функторы, если вы пишете ML). Система типов Хаскелла амбициозна и мощна, но она постоянно совершенствуется, что означает, что в результате истории есть некоторая несогласованность. F# по существу использует систему типов.NET плюс ML-подобный полиморфизм Хиндли-Милнера (см. Вопрос "Что такое Хиндли-Милнер".)

  • OCaml не совсем согласен с тем, думает ли он, что варианты должны быть статически или динамически типизированы, поэтому он предоставляет и "(алгебраические типы данных", и "полиморфные варианты"). Получающийся в результате язык обладает большой выразительной силой, что отлично подходит для экспертов, но то, какую конструкцию использовать, не всегда очевидно для любителя.

  • Порядок оценки OCaml официально не определен, что является плохим выбором дизайна на языке с побочными эффектами. Хуже того, реализации противоречивы: виртуальная машина с байт-кодом использует один порядок, а компилятор с собственным кодом использует другой.

Стоит ли изучать F# или Haskell, если вы знаете OCaml?

Я считаю, что ответ, безусловно, да, в идеале вы должны изучать все три языка, потому что у каждого есть что предложить, но F# - единственный, у которого большое будущее, поэтому, если вы можете изучать только один язык, изучите F#, читая мой Visual F# 2010 - книга по техническим вычислениям или подписка на наш журнал F#.NET.

долголетие

Microsoft взяла на себя обязательство поддерживать F#, когда они выпустили его в рамках Visual Studio 2010 в апреле. Таким образом, F# гарантировано радужное будущее в течение по крайней мере нескольких лет. Благодаря мощному сочетанию практически важных функций, таких как высокопроизводительный REPL с собственным кодом, высокоуровневые конструкции для встроенного в.NET 4 параллелизма и режим IDE производственного качества, F# значительно опережает любое другое функциональное программирование. язык с точки зрения реальной применимости в настоящее время. Честно говоря, никто даже не работает над чем-то, что может конкурировать с F# в ближайшем будущем. Мой собственный проект HLVM с открытым исходным кодом - попытка сделать это, но он далеко не готов.

В отличие от OCaml и Haskell разрабатываются в крайне непродуктивных направлениях. Это убивает OCaml уже несколько лет, и я ожидаю, что Haskell последует его примеру в течение следующих нескольких лет. Большинство бывших профессиональных программистов на OCaml и Haskell уже перешли на F# (например, Credit Suisse, Flying Frog Consultancy), и большинство остальных, несомненно, перейдут на более практичные альтернативы, такие как Clojure и Scala, в ближайшем будущем.

В частности, лицензия QPL OCaml не позволяет кому-либо еще исправлять растущее число фундаментальных ошибок проектирования (ограничения строки и массива 16 МБ на 32-разрядных компьютерах, отсутствие параллелизма в разделяемой памяти, отсутствие типов значений, параметрический полиморфизм посредством стирания типов, интерпретируемый REPL, громоздкий FFI и т. д.) потому что они должны распространять производные работы только в виде исправлений к оригиналу, а сопровождающие пакета Debian отказываются признавать альтернативный апстрим. Новые функции, добавляемые в язык, такие как первоклассные модули в OCaml 3.12, далеко не так ценны, как это было бы с многоядерными возможностями.

Некоторые проекты были начаты в попытке спасти OCaml, но они оказались слишком поздно. Параллельный сборщик мусора практически бесполезен, и Дэвид Теллер вышел из проекта " Батареи включены " (хотя он был поднят и выпущен в урезанном виде). Следовательно, OCaml превратился из самого популярного функционального языка в 2007 году в серьезный спад сегодня, с 2007 года трафик в списке кулачков сократился более чем на 50%.

У Haskell меньше промышленных пользователей, чем у OCaml, и, хотя он имеет многоядерную поддержку, он все еще развивается в очень непродуктивном направлении. Haskell разрабатывается почти полностью двумя людьми из Microsoft Research в Кембридже (Великобритания). Несмотря на то, что чисто функциональное программирование отрицательно сказывается на производительности, они продолжают пытаться разрабатывать решения для параллельного Haskell, ориентированные на многоядерные процессы, когда огромное количество ненужного копирования, которое оно берет на себя, попадает в стену памяти и разрушает любую надежду на масштабируемый параллелизм на многожильный.

Единственным крупным пользователем Haskell в отрасли является Galois с около 30 штатными программистами на Haskell. Я сомневаюсь, что они позволят Хаскеллу полностью умереть, но это не значит, что они превратят его в более полезный язык.

практицизм

Я написал статью о хеш-таблицах, которую вы цитировали. Это хорошая структура данных. Другие люди ссылались на чисто функциональные альтернативы, такие как троичные деревья и деревья Патриции, но на практике они обычно примерно в 10 раз медленнее, чем хеш-таблицы. Причина заключается в том, что кэш-память сегодня пропускает доминирующие проблемы с производительностью, и деревья подвергаются дополнительным косвенным указателям O(log n).

Лично я предпочитаю необязательную лень и необязательную чистоту, потому что в реальном мире оба они, как правило, контрпродуктивны (например, лень делает производительность и потребление памяти крайне непредсказуемым, а чистота серьезно ухудшает производительность в среднем случае и превращает совместимость в кошмар). Я один из немногих людей, полностью зарабатывающих на жизнь функциональным программированием через мою собственную компанию. Достаточно сказать, что если бы я думал, что Haskell жизнеспособен, я бы диверсифицировался в него много лет назад, но я продолжаю делать выбор, потому что я не верю, что он коммерчески жизнеспособен.

Вы сказали: "Мне не нравится быть привязанным к громоздкой платформе.NET, если преимущества не велики". Преимущества огромны. Вы получаете IDE производственного качества, JIT-компилятор производственного качества, который выполняет чрезвычайно эффективные оптимизации, такие как дженерики, специализирующиеся на типах, библиотеки производственного качества для всего, от программирования GUI (см. Game of Life в 32 строках F#) до обработки чисел. Но реальное преимущество.NET, по крайней мере для меня, состоит в том, что вы можете продавать библиотеки, написанные на F#, и зарабатывать много денег. Никому еще не удавалось продавать библиотеки программистам OCaml и Haskell (и я один из немногих, кто пробовал), но библиотеки F# уже продаются в значительных количествах. Так что громоздкий.NET Framework того стоит, если вы хотите зарабатывать на жизнь написанием программного обеспечения.

Хорошо спроектированный

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

Это не было одним из ваших критериев, но рассматривали ли вы наличие работы? В настоящее время Haskell перечисляет 144 рабочих места, Ocaml - 12 и C# - 26 000. Эти цифры не идеальны, но могу поспорить, что после того, как F# выйдет, пройдет немного времени, прежде чем он пролетит мимо Хаскелла и Окамля по количеству списков вакансий.

До сих пор каждый язык программирования, включенный в Visual Studios, имеет тысячи списков вакансий для него. Сдается мне, что если вы хотите наилучшим образом использовать функциональный язык программирования в качестве своей повседневной работы, то вскоре станет F#.

долголетие

Никто не может предсказать будущее, но

  • OCaml и Haskell в течение ряда лет успешно развиваются, что предвещает их будущее
  • когда F# будет поставляться с VS2010, у MS будут юридические обязательства поддерживать его как минимум 5 лет

практицизм

Перф: Мне не хватает опыта из первых рук с Haskell, но на основании информации из вторых и третьих рук, я думаю, что OCaml или F# более прагматичны, в том смысле, что я думаю, что вы вряд ли сможете чтобы получить тот же результат исполнения в Haskell, что и в OCaml из F#.

Библиотеки: легкий доступ к.Net Framework - огромное преимущество F#. Вы можете рассматривать его как "привязанный к этой громоздкой вещи", если хотите, но не забывайте, что "у вас есть доступ к огромной громоздкой библиотеке часто невероятно полезных вещей". "Связь" с.Net является одним из главных преимуществ F#. F# моложе и поэтому имеет меньше сторонних библиотек, но уже есть, например, FsCheck, FParsec, Fake и множество других, в дополнение к библиотекам "в коробке" на.Net.

Инструментарий: у меня недостаточно личного опыта для сравнения, но я думаю, что интеграция VS с F# превосходит все, что вы найдете сегодня для OCaml/Haskell (и F# здесь будет немного улучшаться в течение следующего года).

Изменение: F# все еще меняется, поскольку приближается к своему первому поддерживаемому выпуску в VS2010, поэтому есть некоторые серьезные изменения в языке / библиотеке, которые вам, возможно, придется пережить в ближайшем будущем.

Хорошо разработан

Haskell определенно красив и последовательн. Я не знаю достаточно OCaml, но моя догадка, что это так же привлекательно. Я думаю, что F# "больше", чем любой из них, что означает более пыльные углы и несоответствия (в основном в результате посредничества несоответствия между FP и.Net), но в целом F# все еще кажется мне "чистым", и несоответствия, которые существуют, являются, по крайней мере, обоснованными / намеренными.

В общем и целом

По моему мнению, вы будете в "хорошей форме", хорошо зная любой из этих трех языков. Если вы знаете большой долгосрочный проект, для которого вы хотите его использовать, он может выделиться, но я думаю, что многие навыки будут переносимы (легче между F# и OCaml, чем в / из Haskell, но также легче среди любого из этих трех, чем, скажем, с Java).

Там нет простого ответа на этот вопрос, но вот несколько вещей, чтобы рассмотреть:

Haskell и OCaml - оба зрелые языки с сильными реализациями. На самом деле, есть несколько хороших реализаций Haskell, но я не думаю, что это главное в его пользу для вашей цели.

F# намного моложе, и кто может предсказать, где Microsoft решит его взять? То, как вы к этому относитесь, зависит больше от того, как вы относитесь к Microsoft, чем от всего, что кто-либо может рассказать вам о языках программирования.

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

Haskell дает вам все это (кроме объектов, в значительной степени), но также более или менее заставляет вас переосмыслить все, что вы думаете о программировании. Это может быть очень хорошо, если вы хотите узнать что-то новое, но это может быть больше, чем вы хотите откусить. Я говорю это как кто-то, кто, возможно, только на полпути к тому, чтобы стать продуктивным, счастливым программистом на Haskell.

И OCaml, и Haskell используются для написания множества различных типов программ, а не только компиляторов и AI или чего-либо еще. Google твой друг.

Последнее замечание: OCaml дает вам хеш-таблицу, но вряд ли разумно использовать ее в коде, если вы действительно хотите использовать функциональное программирование. Постоянные деревья (например, Data.Map) - действительно правильное решение для Haskell, и они обладают множеством полезных свойств, что является одной из самых интересных вещей, которую нужно узнать при покупке Haskell.

F# и OCaml очень похожи по синтаксису, хотя, очевидно, F# лучше с.NET.

То, что вы изучаете или используете, должно зависеть от платформы, к которой вы стремитесь.

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

Есть и другие функциональные языки, такие как Erlang, на которые вы могли бы взглянуть, но, по сути, если вы сильны в одном языке FP, тогда вы сможете быстро выбрать другой, поэтому просто выберите тот, который вам нравится, и попробуйте разрабатывать интересные и сложные приложения в нем.

В конце концов, разработчики языка найдут способ заставить ОО-языки хорошо работать с многоядерными процессорами, и FP может снова упасть на обочину, но в ближайшее время этого не произойдет.

С точки зрения продолжительности жизни очень трудно судить о популярности языков, но просто сделав небольшую проверку здесь, вот количество вопросов, помеченных соответствующим (функциональным) языком: -

2672 Scala, Haskell 1936, 1674 F#, 1126 Clojure, схема 709, 332 OCaml

Я бы сказал, что это было хорошим показателем того, какие языки люди активно изучают в данный момент, и, следовательно, может быть хорошим показателем того, какие языки могут быть популярны в ближайшие несколько лет.

Это напрямую не связано с вопросом ОП относительно того, стоит ли изучать F#, а скорее является примером реального использования OCaml в финансовом секторе: http://ocaml.janestreet.com/?q=node/61

Очень интересный разговор.

Другие вопросы по тегам