Должен ли я изучать Haskell или F#, если я уже знаю OCaml? [закрытый]

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

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

  • долговечность

    • какой язык будет длиться дольше? Я не хочу учиться чему-то, что может быть оставлено через пару лет пользователями и разработчиками.
    • будет с Inria, Microsoft, в Университете Глазго и впредь поддерживать их составителями долго бежать?
  • практичность

    • статей этой заставьте меня бояться использовать Haskell. Хэш-таблица-лучшая структура для быстрого поиска. Сторонники Haskell предлагают использовать данные.Карта, которая является двоичным деревом.
    • мне не нравится быть привязанным к громоздкой .NET framework, если преимущества не велики.
    • Я хочу иметь возможность разрабатывать больше, чем просто Парсеры и математику программы.
  • Хорошо Разработана

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

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

8 ответов


долговечность

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

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

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

практичность

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

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

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

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

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

  • труднее всего предсказать поведение времени и пространства Haskell программы.

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

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

для представления о диапазоне того, что возможно в Haskell, проверьте xmonad диспетчер окон и подавляющее ofpackages массив at hackage.haskell.org.

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

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

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

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

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

  • 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 уже перешли на F# (например, Credit Suisse, Flying Frog Consultancy), а большинство остальных, несомненно, в ближайшем будущем перейдут на более практичные альтернативы, такие как Clojure и Scala.

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

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

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

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

практичность

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

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

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

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

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


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

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


долговечность

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

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

практичность

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

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

Tooling: у меня недостаточно личного опыта для сравнения, но я думаю, что интеграция 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 дает вы hashtable, но вряд ли разумно использовать его в коде, если вы действительно хотите охватить функциональное программирование. Постоянные деревья (например, данные.Карта) действительно правильное решение для Haskell и имеют много хороших свойств, что является одной из интересных вещей, чтобы узнать о том, когда вы забираете Haskell.


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

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

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

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

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


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

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


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

2672 Scala, 1936 Хаскелл, 1674 F#, 1126 в Clojure, 709 схема, Данные, используемые 332

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