Недавно мне пришло письмо от одного из посетителей с просьбой помочь решить небольшую проблему с OCaml ‘ом. И как-то между делом он поинтересовался, почему я отказался от OCaml в пользу Haskell. После небольшого раздумья я ответил, что это сложный вопрос и что я не готов вот так сразу на него ответить, а также пообещал когда-нибудь написать пост на эту тему. И вот, я наконец-то собрал свои мысли в кучку.
[Режим кэпа.] Haskell против OCaml — это такая же холиварная тема, как Emacs против Vim, Git против Mercurial, Google+ против Facebook или McDonalds против KFC. Оба языка очень хороши и оба могут замечательно справляться с широкими классами задач. В конечном счете все сводится к субъективному восприятию, историческим причинам, привычкам, личным предпочтениям, умению готовить и так далее. И здесь я поведаю о моих личных предпочтениях и исторических причинах, поскольку есть основания полагать, что кому-то это по каким-то причинам интересно. Только и всего. [Выход из режима кэпа.]
На самом деле, вопрос «почему я отказался от OCaml и сделал выбор в пользу Haskell» поставлен совершенно некорректно. Я ничего не выбирал и ни от чего не отказывался. Я вообще зарабатываю на жизнь программированием на Erlang’е , а на Haskell так, хэлловорлды пописываю. Поэтому следовало бы задать вопрос «почему я так интересуюсь Haskell’ем и не интересуюсь так же сильно, например, OCaml’ом».
Haskell видится мне очень хорошим языком программирования. Пожалуй, лучшим языком программирования общего назначения (хотя мы уже выяснили, что все это DSL ) из тех, на которых мне доводилось писать до сих пор. Подробности можно найти в этой заметке , хотя, если бы я писал ее сегодня, то кое-что, пожалуй, изменил. Я искренне надеюсь, что когда-нибудь буду работать над проектом, написанным на Haskell, и тогда я наконец-то смогу сосредоточиться на действительно важных вещах, а не на глупостях вроде вывода типов в уме или борьбы с побочными эффектами. А пока я как бы готовлюсь. Также Haskell интересен тем, что, программируя на нем, вы открываете для себя хорошие практики, которые можно применить в своей работе независимо от используемого языка.
OCaml и Haskell во многом похожи. Строгая статическая типизация , автоматический вывод типов, автоматическая сборка мусора, уклон в сторону функционального программирования… А раз так, то почему мне интереснее Haskell? Вот некоторые причины, почему OCaml мне интересен не так сильно:
- По историческим причинам я раньше познакомился с Haskell. Его преподавали в институте на 4-м курсе в рамках лекций по функциональному программированию. Я имею б о льший опыт работы с ним и лучше его понимаю;
- Синтаксис у Haskell попроще и поприятнее , без наворотов из наследования, именованных аргументов, значений аргументов по умолчанию и так далее;
- У Haskell есть cabal и Hackage с кучей библиотек и прекрасной документацией по ним. Все это вызывает у меня ассоциации со старым добрым CPAN. У OCaml есть opam, но библиотек там на порядок меньше, чем на Hackage (451 против 3621 на момент написания этих строк);
- Лично у меня создалось впечатление, что сообщество хаскелистов намного больше и активнее, чем сообщество программистов на OCaml. Поэтому Haskell выглядит живым и развивающимся, а OCaml заброшенным и никому не нужным. Никто не хочет быть один, всем хочется тепла и общения;
- Не представляет труда найти литературу и статьи по Haskell, описывающие, как решать на нем вполне конкретные задачи, например, ходить в базы данных или писать GUI, притом сделать это обычно можно двумя или тремя способами на выбор. Когда читаешь книги и статьи по OCaml, как правило, акцент делается на синтаксисе языка. Когда же пытаешься разобраться, скажем, есть ли биндинги некой библиотеки для OCaml, обычно выясняется, что есть, но их нужно собрать руками и, на самом деле, они давно никем не поддерживаются, и вообще, вы не должны этого хотеть;
- Открыв для себя классы типов, я больше не понимаю, как можно писать сколь-либо серьезный код без них;
- Есть многочисленные сведения , что в OCaml имеются некоторые проблемы с многопоточностью;
- Haskell удобнее. Если я хочу создать проект на Haskell , то ставлю Haskell Platform, говорю cabal sandbox, прописываю зависимости и вперед! В случае с OCaml мне нужно собрать из исходников OCaml 4.x, затем собрать opam, затем прикрутить батарейки , затем черт знает где искать библиотеки…;
- Наконец, есть серьезные подозрения, что если в третьем тысячелетии хочется чего-то вроде OCaml, с ООП и ФП, побочными эффектами и так далее, то лучше взять Scala ;
Но это все — лично моя история и мои впечатления. Я тупой и криворукий джуниор , так что не верьте мне на слово. Если вы не знаете, что выбрать, Haskell или OCaml, просто выучите оба языка и посмотрите, какой из них вам больше по душе. Это займет не так много времени, как кажется.
Дополнение: Также на тему Haskell против OCaml можно послушать Владимира Шабанова , который писал лет по пять на каждом их этих языков.