Какой наиболее совместимый, широко используемый язык производства используется для экспорта знаний и навыков, полученных в Haskell?

14

Мне нравится Haskell, простой и понятный. Хотя Haskell используется в производственном программном обеспечении, он не особенно широко распространен из того, что я видел. Какой язык является наиболее похожим и все еще широко используемым в отношении производственных проектов, чтобы у меня был шанс использовать что-то удивительное в промышленности?

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

Мировой инженер
источник

Ответы:

21

Haskell наиболее тесно связан с семейством языков ML. Это включает в себя такие вещи, как OCaml , конечно, но и F # на платформе .NET. Эти языки разделяют с Haskell основы системы типов и то, как используются данные - алгебраические типы данных, сопоставление с образцом, вывод типов и т. Д. Разумеется, они могут существенно отличаться от Haskell в других аспектах - большинство ML являются строгими и нечистыми Начнем с того, что популярность Haskell как средства исследования систем типов и дизайна языков означает, что большинство языков стиля ML имеют тенденцию иметь менее мощные (но потенциально более простые для понимания) системы типов. Можно с уверенностью сказать, что в то время как вы можете пропуститьнекоторые вещи о Haskell, особенно на первых порах, большинство программистов на Haskell, вероятно, чувствовали бы себя комфортно в ML довольно быстро, на базовом уровне достижения цели. Если вам нужен язык с такой же общей структурой, как у Haskell, лучше всего использовать ML.

Функциональная сторона ScalaТакже в значительной степени опирается на традицию ML, а также использует некоторые усовершенствованные функции системы типов, знакомые с Haskell, а также более стандартную систему ООП, интегрированную с вышеупомянутым. В то время как ОО в языках в стиле ML имеет тенденцию восприниматься как «модель ОО с базовыми функциональными инструментами», Scala живет и дышит ОО в стиле Java. Как вы можете себе представить, это имеет преимущества для взаимодействия с Java и предоставляет более знакомую рабочую среду для программистов ОО. Однако, исходя из опыта работы с Haskell, вы, скорее всего, будете раздражены тем, что смешивание вещей в Scala делает функциональные идиомы неуклюжими, а большинство API-интерфейсов Java плохо спроектированы и излишне сложны в использовании.

Наконец, хотя это может показаться странным, Clojure на самом деле имеет много общего с Haskell на более философском уровне. Большая часть того, что вы найдете в подходе Clojure к состоянию и ценностям и идентичностям , очень близка по духу тому, что Хаскель формализует через систему типов. Соответственно, Clojure делает упор на взаимодействие с Java в меньшей степени и не слишком беспокоится о перетаскивании в ООП, поэтому в некоторых отношениях подход Clojure к функциональному программированию сам по себе может быть ближе всего к тому, с чем вы уже знакомы. Я думаю, что это говорит о том, что, насколько мне известно, Clojure является единственным языком, кроме Haskell, который имеет реализацию STMэто просто, эффективно и просто работает. С другой стороны, Clojure происходит из традиции Лиспа и поэтому не имеет статической системы типов и акцентирует внимание на алгебраических типах данных и сопоставлении с образцом, которые встречаются в языках под влиянием ML. И, конечно, это Лисп, который сам по себе негативен для некоторых людей (хотя я действительно не знаю почему).

Говоря от себя, с отказом от ответственности, что мой первый опыт с функциональным программированием был в Scheme, я, вероятно, склонялся бы к Clojure, с OCaml, вероятно, вторым выбором.

CA Макканн
источник
1
Говорят, что F # был вдохновлен, если не получен, от OCaml. Предыдущий вопрос SO, F # и OCaml , охватывает хорошее обсуждение этих отношений. Если вы находитесь на стороне .NET, F # будет отличным выбором, и Microsoft теперь считает F # "первоклассным" языком .NET. Со стороны JVM у Scala есть опыт промышленного использования, и Clojure, похоже, растет в чартах. В настоящее время я не знаю ни одного лучшего выбора, поскольку рынок еще не объявил явного победителя в этом объектно-функциональном пространстве.
Джон Тоблер
4

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

Юрген Штробель
источник
3

Функциональной альтернативой является Erlang . Хотя это очень параллельный язык, последовательное подмножество является чисто функциональным языком со многими свойствами функциональных языков, например замыканиями, неизменяемыми данными и сопоставлением с образцом. Он работает на многих платформах, включая linux, различные unixes, windows и macosx. В настоящее время даже есть реализация на JVM, erjang . Он может легко общаться и сосуществовать с другими языками, именно так он часто используется.

Проверьте основной сайт .

rvirding
источник
3

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

Основные функции Clojure, которые пользователи Haskell могут найти знакомыми и убедительными:

  • Базовый язык является чисто функциональным - хотя побочные эффекты возможны, они скрыты в определенных местах (например, ссылки на STM, функции ввода-вывода, совместимость с Java)
  • Все структуры данных неизменны и постоянны
  • Лень - достигается в основном благодаря вездесущим ленивым последовательностям Clojure, это будет очень знакомо пользователям Haskell. Бесконечные ленивые последовательности в порядке.
  • Программная транзакционная память - это основной способ обработки изменяемого состояния в Clojure. Стоит посмотреть это отличное видео, где Рич Хики объясняет подход Clojure к личности и состоянию: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Основные различия (могут быть положительными или отрицательными в зависимости от вашей точки зрения):

  • Это нечисто - хотя мое наблюдение заключается в том, что идиоматический стиль Clojure - придерживаться чистых функций везде, где это возможно.
  • Динамическая, а не статическая типизация (хотя подсказки статического типа можно использовать для оптимизации производительности)
  • Это язык JVM с легким доступом ко всей экосистеме библиотеки Java - это, на мой взгляд, самое большое преимущество с точки зрения применимости в реальном мире
  • Синтаксис Лиспа. Таким образом, вы получаете все преимущества гомойконичности за счет необходимости учиться видеть сквозь круглые скобки :-)

Личная точка зрения: я изучал Haskell до Clojure и любил Haskell за его элегантность и математическую чистоту. Clojure черпает много вдохновения и заимствует много хороших особенностей у Haskell, но это гораздо более прагматичный / практический язык. Особенно, если учесть огромную ценность возможности использования экосистемы библиотек Java, тогда это отличный язык для «выполнения работы».

mikera
источник
1

Если вам нравится Haskell, но вам нужно написать код для JVM, вам может быть интересен frege . Он спроектирован как можно ближе к Haskell 2010, но при этом генерирует код Java.

Конечно, сам по себе frege не имеет ничего общего с «широко используемым рабочим языком» (он только недавно был опубликован), но Java, безусловно, есть.

Инго
источник