Подтвердить что ты не робот

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

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

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

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

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

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

    • Мне нравятся мои языки.

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

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

Для представления диапазона возможного в Haskell, зайдите в диспетчер окон xmonad и огромный массив пакетов на hackage.haskell.org.

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

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

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

Мне нравятся мои языки.

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Perf: У меня недостаточно опыта из первых рук с 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).

Ответ 5

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

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

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

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

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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