Статьи

Сравнение Ruby и Haskell, часть II

Давайте продолжим наше обсуждение между Haskell и Ruby. Если вы пропустили первый пост, проверьте его здесь

Встроенный

Вот где Haskell и Ruby невероятно похожи. У обоих есть отличные утилиты, которые встроены в спецификацию языка, что означает, что они гарантированно доступны.

Функции, которые предоставляет Haskell, невероятно полезны, особенно для таких вещей, как работа с массивами / списками — они являются основой функциональных языков программирования. Например, функция takeWhile

Кажется, что Ruby не предлагает такой же уровень полезности в глобальных функциях, но все объекты забиты удивительными методами экземпляров, которые делают жизнь хакера Ruby намного проще.

Огромное количество встроенных методов в Haskell очень мало напоминает C и больше напоминает Ruby или Python. C — это минималистичный язык — для изучения синтаксиса и всех встроенных функций требуется всего несколько дней. Однако при написании больших программ это усложняет жизнь. С Haskell это не так — это большая спецификация с множеством функций, которые невероятно полезны при написании кода на языке.

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

takeWhile (<5) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

view raw
gistfile1.hs
hosted with ❤ by GitHub

По сути, он принимает функцию (то есть (<5)

Он смотрит на 1 (получает значение true), затем на 2, затем на 3 и так далее, пока не достигнет 5, после чего возвращает список [1, 2, 3, 4].

Реализация этой функции — отличное упражнение в Haskell (не беспокойтесь, если вы не понимаете синтаксис):

myTakeWhile p x:xs
| p x = x ++ myTakeWhile p xs
| otherwise = []

view raw
gistfile1.hs
hosted with ❤ by GitHub

Не вдаваясь в детали, эта функция рекурсивна и в основном проверяет, возвращает ли переданная функция значение true. Если он возвращает true, он продолжает работать (и добавляет элемент в список). В противном случае он заканчивается и возвращает список, накопленный к настоящему времени. Все это делается в три строки кода.

Без какого-либо опыта работы с Haskell код может выглядеть загадочно, но на самом деле он действительно прост.

Многие другие такие функции предлагают отличные учебные упражнения в Haskell.

сообщество

Сообщество Ruby довольно распространено, и в нем очень много людей. Кажется, что есть две части, с конвергенцией в середине. Есть люди, которые работают с Ruby, и есть люди, которые работают с Rails.

Конечно, все люди из Rails работают с Ruby (я считаю их отдельными, так как многие люди из Rails не считают себя людьми из Ruby), но очень немногие люди, использующие Ruby, не знакомы с Rails , Таким образом, сообщество вещей, не связанных с Rails, все еще не невероятно большое.

RubyGems — это отличное место, где происходит совместная работа, и невероятно простое деление кода ruby.

Сообщество в значительной степени вполне принимает. Это не все проводится в одном месте, с небольшими участками сообщества, происходящего повсеместно.

Сообщество Haskell, с другой стороны, действительно сплочено. Их канал #haskell на Freenode регулярно насчитывает 900 человек (по сравнению с, возможно, 500 для #ruby). Wiki Haskell.org — это центральное место для всей документации по Haskell.

Cabal похож на RubyGems, однако есть некоторые проблемы. Многие библиотеки не так хорошо протестированы и не так хорошо документированы, как Ruby. Поэтому иногда становится довольно сложно выбрать хорошую библиотеку для данной цели. Например, существует около 6 миллионов библиотек для запросов к базам данных, из которых 99% совершенно бесполезны. Однако это происходит почти со всеми языками на стадиях роста, и сообщество усердно работает, чтобы попытаться взять это под контроль.

Наконец, и, возможно, самое главное, сообщество Haskell — одно из самых восприимчивых и терпеливых, кого я когда-либо видел в отношении любых технологий. Кажется, все понимают, что Haskell — это сложный язык, который трудно понять за один раз и который всегда готов помочь. Если у вас есть какие-либо проблемы с кодом на Haskell, люди в #haskell на Freenode всегда готовы помочь. Я помню, как кто-то объяснял мне функторы (большое имя для чего-то, что вы можете повторить в основном) более 45 минут, и я отчаянно пытался разорвать связи, которые я мысленно установил с ООП. Если бы не связность и принятие природы сообщества Haskell, язык все равно был бы ограничен небольшой группой ученых.

трудность

Ruby — это невероятно простой язык, независимо от того, являетесь ли вы опытным программистом или новичком. Он достаточно мощный, чтобы работать на обоих.

С Haskell ситуация немного сложнее. Язык довольно легко выучить, если вы еще не окунулись в ООП, потому что вы не оказались в чем-то совершенно не в своей зоне комфорта. Если вы не знаете никакого программирования, Haskell не невероятно сложен в изучении, некоторые могут сказать, что это легко.

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

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

Мне все еще кажется, что я решаю головоломки, когда пишу функции на Хаскеле, но я понял кое-что очень важное. Несмотря на то, что я немного медленнее запускаю код на Haskell, я трачу меньше времени на отладку на Haskell, чем на другие языки (например, Ruby). Это связано с несколькими причинами.

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

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

Изучение Хаскелла

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

Я нашел руководство LYAH отличным (как я упоминал в предыдущей части). Он написан в развлекательном стиле и очень хорошо знакомит вас со всеми удивительными чертами Хаскелла.

Вот несколько советов при изучении языка Haskell:
* Не пытайтесь делать то, что сразу практично — это придет позже
* Project Euler — отличное место для отработки ваших навыков в Haskell
* Не пытайтесь изучать монады и функторы слишком рано в игре — это только испортит ваше понимание
* Поэкспериментируйте с ghci (системой, похожей на repl для Haskell), она действительно поможет вам почувствовать язык
* Флаг :t
* Не бойтесь просить о помощи — как уже упоминалось, #haskell полон людей, которые хотят познакомить новичков с чудесами Хаскелла

Что теперь?

Надеюсь, вы немного узнали о Haskell и о том, как он относится к Ruby.

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

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

Итак, попробуйте и попробуйте !