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

StackOverflow https://stackoverflow.com/questions/822752

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

  • Хаскелл - это de facto доминирующий язык исследований в области функционального программирования.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, ознакомьтесь с хмонад оконный менеджер и огромный выбор упаковок в hackage.haskell.org.

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

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

Хорошо продуманный

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Хорошо продуманный

Все эти языки хорошо разработаны, но для разных целей.OCaml специально разработан для написания доказательств теорем, а 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 лет

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

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

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

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

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

Хорошо продуманный

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

В целом

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

На этот вопрос нет простого ответа, но вот некоторые вещи, которые следует учитывать:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2672 Scala, 1936 Haskell, 1674 F #, 1126 Clojure, 709 Scheme, 332 OCaml.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top