Как учить haskell?

yroslavasako

Раньше имел очень поверхностное знакомство с функциональными языками. Посмотрел тут некоторые идиомы разработки на хаскелл. Внешне это всё кажется неподъемным, в каком порядке и что нужно читать/писать, чтобы понять указанный выше юмор?

sergeikozyr

Учебник Душкина только не бери. Вот, лучше это почитай: http://book.realworldhaskell.org/read/

yroslavasako

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

pitrik2

Учебник Душкина только не бери.
[15:24:44] Wi says: а чем Душкина книжка плоха?
[15:24:55] lomeo says: наверна потому что много математики, но вроде по его книге учат в некоторых вузах
[15:25:21] Wi says: а вы там вроде вторую вместе писали
как процесс?
[15:25:39] lomeo says: всё пишем бля
[15:25:43] lomeo says: я торможу :))
[15:25:51] lomeo says: сейчас по дб пишу
[15:25:57] Wi says: она лучше будет?
[15:26:08] lomeo says: ну математики там почти не будет.
[15:26:13] lomeo says: только краткое введение в лямбду
[15:26:23] lomeo says: монады я постарался описать очень просто

sergeikozyr

Математика? Ну-ну, чего-то я там её не заметил ;)
Книга плоха сумбурностью изложения прежде всего.

zya369

Математика? Ну-ну, чего-то я там её не заметил ;)

там есть аццкое определение индукции для любых линейно-упорядоченных множеств :grin:

bleyman

Искренне и от всего сердца рекомендую прочитать SICP, которое одновременно и сделает тебя более хорошим программером, и привьёт стойкое отвращение к лиспу (не, это прикольно, конечно, когда чуваки придумывают офигенные штуки, позволяющие использовать это убожество красиво, типа голь на выдумки хитра, но их выдумки лучше всё-таки использовать в нормальных языках).
А потом задай себе вопрос, нужно ли тебе понимать юмор хаскеляторов? Обрати особое внимание на последний кусок текста ("But seriously, folks, ..." вот мы все верим Дийкстре, что BASIC causes brain damage, я видел достаточно много творений хаскеляторов, чтобы быть практически уверенным, что хаскель тоже разрушает мозг, хоть и немного по-другому. Днесь 2.6 питон вышел, и там они! pep-3141, вот серьёзно, это же пиздец-пиздец-пиздец, а пункт "Rejected Alternatives", особенно строчка "We had expected this to be useful to people using vectors and matrices, but the NumPy community really wasn't interested", ну, она какбэ говорит нам, что у тех чуваков ебанутость, укоренившаяся в участках мозга, ответственных за программирование, пустила метастазы и теперь они ебануты полностью. Это даже не смешно.
(кстати надеюсь, что Гвидо, видимо решивший, что "проще дать, чем объяснить, почему не хочешь", осознает порочность этого пути и пресечёт дальнейшие попытки скатить питон в сраное говно на корню)

yroslavasako

А потом задай себе вопрос, нужно ли тебе понимать юмор хаскеляторов? Обрати особое внимание на последний кусок текста ("But seriously, folks, ...")
Я обратил внимание на тот факт, что они рекомендовали эту подборку в роли учебного пособия. Или ты имеешь в виду что незачем в принципе хаскел досконально изучать?
Днесь 2.6 питон вышел, и там они! pep-3141, вот серьёзно, это же пиздец-пиздец-пиздец, а пункт "Rejected Alternatives", особенно строчка "We had expected this to be useful to people using vectors and matrices, but the NumPy community really wasn't interested", ну, она какбэ говорит нам, что у тех чуваков ебанутость, укоренившаяся в участках мозга, ответственных за программирование, пустила метастазы и теперь они ебануты полностью. Это даже не смешно.
Мне пока трагичность ситуации не заметна, зато посмеялся я от души. Они серьёзно?

sergeikozyr

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

yroslavasako

но у язычка этого нет ничего похожего на нормальную стандартную библиотеку
Кстати, кроме boost и Loki есть другие либы общего назначения для цэпэпэ?

july

использовать это убожество красиво,
Рискую скатиться в холивар, но почему убожество?

bleyman

Или ты имеешь в виду что незачем в принципе хаскел досконально изучать?
---
Я не знаю, я ещё не пробовал =)
Меня действительно как-то пугает концентрация не по хорошему сумасшедших людей в коммьюнити. Это наверное неспроста, так что изучать нужно осторожно, стараясь не увлечься. Желательно при этом иметь в активе какой-нибудь нормальный язык, вроде C# третьей версии (LINQ это, на самом деле, monad comprehension, и классические монады на нём весьма няшно реализуются чтобы не впечатлиться слишком сильно, и чтобы не считать, что зубодробительность концепций (точнее, их объяснения) и использование хаскеля являются необходимым злом, с которым можно мириться.

sergeikozyr

Кстати, кроме boost и Loki есть другие либы общего назначения для цэпэпэ?
буст блять, и локи. Почему эти долбоёбы не запихнули туда простенький парсер URL-ов?

sergeikozyr

какой-нибудь нормальный язык
4.2
таких нет. Цешарп-таки уровнем ниже хаскеля.

bleyman

Потому что лучше уж на ассемблере битики перекладывать, чем обнаруживать, что супер-пупер-абстрактная абстракция при использовании всё равно требует тыкать в списки немытыми потными c[ad]+r. По крайней мере в том же SICP это постоянно происходит.
Ну и скобки достают немножко. Совершенно любой пример из начала SICP, где ещё нет макросов, при переписывании на питоне оказывается в миллион раз чище. Макросы круты, конечно, но писать-то их приходится на том же лиспе...
Ну и макросы сосут по сравнению с, например, фортовыми IMMEDIATE. Не то, чтобы это действительно сильно напрягало, но ощущение убогости усиливает.
Ну и стандартная библиотека, да. Протокол работы с хэштейблами меня поразил до глубины души, так нельзя! Собственно, если посмотреть на описание Paul Graham's "Arc", то видно, насколько просто некоторые фейлы можно исправить, типа вот этого. Впрочем, он тоже далеко не все исправляет, ИМХО.

Andbar

буст блять, и локи. Почему эти долбоёбы не запихнули туда простенький парсер URL-ов?
Зачем библиотеке языка общего назначения такая специфическая штука? Имхо, слишком большое разбухание стандартной библиотеки - не самая лучшая практика.

slonishka

буст блять, и локи. Почему эти долбоёбы не запихнули туда простенький парсер URL-ов?
(ни в коем случае не в защиту буста) зачем в стандартной библиотеке парсер урлов?
типа: вам шашечки или ехать? ты их только парсить чтоли собираешься?

sergeikozyr

ехать - это иметь возможность безгеморно реализовывать алгоритмы, не отвлекаясь на всякую мелочь, вроде разбиения строки на список строк по разделителям. А в цепепе даже этого нет из коробки.
Едут python и java, которые имею не только парсер url-ов, но и большое количество ещё более специализированных вещей. А в цепепе шашечки всякие, вроде "метапрограммирования" на шаблонах.

yroslavasako

потихоньку разбираюсь с языком. Возник вопрос об эффективности. Ну что коэффициенты меньше императивных языков - это понятно, хаскелл намного сложнее. Меня беспокоит вопрос асимптотики и возможности её сохранения. Что опытные люди могут сказать об времени, потребной на сортировку списка? Можно использовать дополнительные структуры данных, например деревья.

conv3rsje

Асимптотику некоторых алгоритмов сохранить будет сложно. Один из примеров это упомянутая тобой сортировка списка.
Большая часть алгоритмов придумывалось в терминах "взять элемент и перезаписать им n-ную ячейку массива"
Реализовывать такие тяжело и довольно бессмысленно. Если у тя алгоритм не такой - то обычно сохраняется.
Асимптотика по памяти - хз, ее тяжелее контролировать.

yroslavasako

Сложно или невозможно вовсе? Просто много алгоритмов предполагают заранее, что мы можем отсортировать массив за nlog(n).

conv3rsje

Все можно :) Только это будет грязный мерзкий код работы с памятью :)
Например, с помощью ByteString или еще того хуже Foreign.Ptr + FFI :)
Я обычно забивал на это и юзал sort из Prelude. Если дюже надо - потом свой пишешь и меняешь импорт.
P.S Дюже надо = тормоза в сорте

tokuchu

Там есть алгоритмы: http://shootout.alioth.debian.org :grin:

yroslavasako

ну показания памяти - явный чит. Они в яву запихивали явамашину. Немудрено, что разницу в 20 раз получали.

karkar

Мне казалось, у тамошней сортировки вполне нормальная асимптотика..

yroslavasako

Ага. Я уже посмотрел. Быстрая сортировка - это тупа три строки с list comprehension
Кто мне подскажет, если два раза вызывается функция для одного и того же аргумента, она будет считаться два раза? Или лучше завести отдельную константу для записи результата функции, чтобы сэкономить время?

tokuchu

если два раза вызывается функция для одного и того же аргумента, она будет считаться два раза?
Ну если она без побочных эффектов и компилятор об этом знает и вообще заморачивается такими вещами, то не будет. Как там в Хаскеле с этим — не знаю. Видел только, что если, например f(a) = a + a, то несмотря на то, что выражения вычисляются лениво, но "a" будет посчитано только 1 раз. Но у тебя другой случай, как я понимаю — g(a, a).

yroslavasako

Но у тебя другой случай, как я понимаю — g(a, a).
правильно понял. Это, конечно, пока не принципиально. Я сначала хочу написать работающую в принципе программу, а потом уже доведу её до ума. Ранняя оптимизация - пустая трата времени.

pitrik2

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

sergeikozyr

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

apl13

какие нах константы в хаскеле?
const :: a -> b -> a
const a _ = a
:book:

apl13

Ну если она без побочных эффектов и компилятор об этом знает и вообще заморачивается такими вещами, то не будет. Как там в Хаскеле с этим — не знаю.
В хаскеле все, что не прелюдная монада, без побочных эффектов.

yroslavasako

закончил разбирать мелкие примеры, решил для тренировки программу написать. Компилирую с помощью ghc, код пишу в соответствующем плагине эклипса.
Сразу возник вопрос. Какие ещё особенности оформления кода влияют на компиляцию программы, кроме идентов? Где об этом можно подробно прочитать? Нубогиды, которые я сейчас читаю на этом не акцентируются.
И ещё: можно ghc задать параметром ширину табов? Если нет, можно ли научить эклипс перед компиляцией автоматически генерировать временный файл, заменив там табы на пробелы, и скармливать его компилятору?

sergeikozyr

код пишу в соответствующем плагине эклипса.
бросай нахрен. Лучше haskell-mode для emacs'а не найдёшь.

pitrik2

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

Gaishnik

Кстати, недавно видел отличную книжку "Haskell - the Craft of Functional Programming". Очень понятно написано, сначала даже кажется, что слишком подробно разжевывают. Еще там в правильном порядке темы расположены. Обычно по традиции начинают с HelloWorld и сразу показывают do нотацию, тип IO и монады, которые являются хитрым хаком, а в этой книжке они в конце идут. В общем, советую.
Оставить комментарий
Имя или ник:
Комментарий: