LINUX.ORG.RU

Вышла книжка по функциональному программированию на Haskell

 ,


3

5

Григорий Макеев выложил в свободный доступ книгу «Основы функционального программирования на языке Haskell».
Скачать можно тут.

>>> Подробности

★★★★

Проверено: anonymous_incognito ()
Последнее исправление: cab (всего исправлений: 1)
Ответ на: комментарий от anonymous

А генту-то каким боком?

Обновление всех пакетов вместе с системой. Это, конечно, тоже палка о двух концах, но, думаю, всё же лучше разброса версий по времени установки.

dmfd
()
Ответ на: комментарий от vertexua

Да, несколько печально. Но позитив в том, что принципиальных сложностей соптимизировать код нет. Поэтому наверное это будет сделано в скором будущем.

Конкретно мне для многих задач была бы удобна обычная Java но с Algebraic Data Types и pattern matching. Ну и, хотелось бы, чтобы не было null values. Но даже это не так критично. Scala и Ceylon недавно смотрел, но несколько убило то, что простецкий «Maybe a» на нём выглядит как-то распухше. А Java-вские Enumы бесславно убили, хотя у них есть свои плюсы. Ну например то, что они гарантированно не расширяемы и по ним быстро идёт matching.

rtvd ★★★★★
()
Ответ на: комментарий от rtvd

Как cabal-dev поможет?

Из вашего описания я не понял, что написано самостоятельно, что - нет. Но если вам не помогает своя песочница для каждого проекта, то, думаю, уже ничего не поможет.

dmfd
()
Ответ на: комментарий от rtvd

Мало того что enum нет, так и EnumMap с ФП плюшками нет. А мне однажды очень О(1) надо было.

гарантированно не расширяемы

sealed - ограничивает возможность описания наследников класса одним файлом. Кстати с ним компилятор может указать в паттерн матчинге что не рассмотрены все варианты.

быстро идёт matching

Вот по EnumMap было бы очень быстро. В итоге написал свой Scala-идиоматический EnumMap. Сами enums пришлось на жабке делать

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от dmfd

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

rtvd ★★★★★
()
Ответ на: комментарий от anonymous
# ghc-pkg list
/usr/lib64/ghc-7.6.2/package.conf.d
   Cabal-1.16.0
   Cabal-1.16.0.3
   ConfigFile-1.1.1
   Diff-0.2.0
   HStringTemplate-0.6.12
   HTTP-4000.2.8
   HUnit-1.2.5.1
   MissingH-1.2.0.0
   MonadCatchIO-mtl-0.3.0.5
   QuickCheck-2.5.1.1
   SHA-1.6.1
   array-0.4.0.1
   attoparsec-0.10.4.0
   base-4.6.0.1
   base-unicode-symbols-0.2.2.4
   base64-bytestring-1.0.0.1
   bin-package-db-0.0.0.0
   binary-0.5.1.1
   binary-0.7.0.1
   blaze-builder-0.3.1.0
   blaze-html-0.6.1.1
   blaze-markup-0.5.1.5
   bytestring-0.10.0.2
   cgi-3001.1.8.3
   citeproc-hs-0.3.7
   containers-0.5.0.0
   css-text-0.1.1
   darcs-2.8.4
   data-default-0.5.1
   dataenc-0.14.0.5
   deepseq-1.3.0.0
   deepseq-1.3.0.1
   digest-0.0.1.2
   directory-1.2.0.1
   dlist-0.5
   extensible-exceptions-0.1.1.4
   feed-0.3.8
   filepath-1.3.0.1
   filestore-0.6
   ghc-7.6.2
   ghc-paths-0.1.0.9
   ghc-prim-0.3.0.0
   gitit-0.10.2
   haddock-2.13.1
   happstack-server-7.1.6
   hashed-storage-0.5.10
   haskeline-0.7.0.3
   haskell2010-1.1.1.0
   haskell98-2.0.0.2
   highlighting-kate-0.5.3.8
   hoopl-3.9.0.0
   hpc-0.6.0.0
   hs-bibutils-4.17
   hscolour-1.20.3
   hslogger-1.2.1
   html-1.0.1.2
   integer-gmp-0.5.0.0
   json-0.7
   mmap-0.5.8
   monad-control-0.3.1.4
   mtl-2.1.2
   network-2.4.1.2
   old-locale-1.0.0.5
   old-time-1.1.0.1
   pandoc-1.10.1
   pandoc-types-1.10
   parsec-3.1.3
   pretty-1.1.1.0
   primitive-0.5.0.1
   process-1.1.0.2
   random-1.0.1.1
   recaptcha-0.1
   regex-base-0.93.2
   regex-compat-0.95.1
   regex-pcre-builtin-0.94.4.5.8.31
   regex-posix-0.95.2
   rts-1.0
   safe-0.3.3
   sendfile-0.7.9
   split-0.2.1.2
   stm-2.4.2
   syb-0.3.7
   syb-with-class-0.6.1.4
   system-filepath-0.4.7
   tagsoup-0.12.8
   tar-0.4.0.1
   template-haskell-2.8.0.0
   temporary-1.1.2.4
   terminfo-0.3.2.5
   texmath-0.6.1.3
   text-0.11.2.3
   threads-0.5.0.1
   time-1.4.0.1
   time-compat-0.1.0.3
   transformers-0.3.0.0
   transformers-base-0.4.1
   unix-2.6.0.1
   url-2.1.3
   utf8-string-0.3.7
   vector-0.10.0.1
   xhtml-3000.2.1
   xml-1.3.12
   xss-sanitize-0.3.3
   zip-archive-0.1.3.4
   zlib-0.5.4.1
Deleted
()
Ответ на: комментарий от vertexua

sealed - ограничивает возможность описания наследников класса одним файлом.

Мне кажется, я где-то видел как этот sealed можно обойти. Но не уверен на 100%.

Вот по EnumMap было бы очень быстро. В итоге написал свой Scala-идиоматический EnumMap. Сами enums пришлось на жабке делать

Я тоже Enums делал на Java, но на свой EnumMap так и решился. Подумал, что это несколько дней уйдёт в лучшем случае.

rtvd ★★★★★
()
Ответ на: комментарий от rtvd

Мне кажется, я где-то видел как этот sealed можно обойти. Но не уверен на 100%.

Не уверен что тут как-то можно сильно навредить. Наверное в очень частных случаях можно, но это из разряда упорина.

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

Есть инструмент в Gentoo - haskell-updater: отлично работает, чтобы руками никуда не лазить самому. Экономит массу времени на обновлениях. Gentoo - вещь!, что у «других» не работает, то в Gentoo давно пройденный этап, при условии что установлен overlay haskell

# eix haskell-updater
[I] app-admin/haskell-updater
     Available versions:  1.2.0.5-r1 (~)1.2.0.8 (~)1.2.0.9 (~)1.2.0.9[1]
     Installed versions:  1.2.0.9[1](13:22:26 04.03.2013)
     Homepage:            http://haskell.org/haskellwiki/Gentoo#haskell-updater
     Description:         Rebuild Haskell dependencies in Gentoo
# layman -l

 * graaff                    [Git       ] (git://git.overlays.gentoo.org/dev/graaff.git                                                                                                                                                     )
 * haskell                   [Git       ] (git://github.com/gentoo-haskell/gentoo-haskell.git                                                                                                                                               )
 * rion                      [Mercurial ] (http://rion-overlay.googlecode.com/hg/                                                                                                                                                           )
 * ruby                      [Git       ] (git://git.overlays.gentoo.org/proj/ruby-overlay.git                                                                                                                                              )
 * science                   [Git       ] (git://git.overlays.gentoo.org/proj/sci.git                                                                                                                                                       )
 * zugaina                   [Rsync     ] (rsync://gentoo.zugaina.org/zugaina-portage  

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от vertexua

Но когда в итоге получается монада IO, то нужно остановиться и перестать курить траву.

А что в ней такого? Есть State, в ней всё чисто. Но State медленна, поэтому есть ST — оптимизация State c настоящим in-place обновлением. IO — это ST над RealWorld.

Но можно и делать то что уже лет 50 делают, просто пишут мутабельный код непосредственно. И самолеты летают, поезда ездят.

50 лет назад параллелизма не было, и mutable state никого не волновал. Сейчас параллизм есть, и ваш "наиболее адекватный подход" с shared mutable state — это главная причина гонок. Поездов. С последующим крушением.

Во-первых ФВП и просто удобства

Ну я и говорил выше: сахарок и умные слова.

dmfd
()
Ответ на: комментарий от rtvd

Вот такой, самый простенький, не как Одерски завещал со 100500 *Like https://gist.github.com/anonymous/5124500

Мне нужно было две вещи - О(1) доступ, и чтобы ФВП работали как на Map. Это если патч слать в стандартную библиотеку классов, то надо что-то серьезнее

vertexua ★★★★★
()
Ответ на: комментарий от dmfd

А что в ней такого? Есть State, в ней всё чисто. Но State медленна, поэтому есть ST — оптимизация State c настоящим in-place обновлением. IO — это ST над RealWorld.

Потому что она вообще нужна упоротым в языках в которых нельзя просто напросто сделать сайдэффект.

Сейчас параллизм есть, и ваш «наиболее адекватный подход» с shared mutable state - это главная причина гонок.

Shared-nothing architecture

Ну я и говорил выше: сахарок и умные слова.

Any problems with that?

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от dmfd

ваш «наиболее адекватный подход» с shared mutable state — это главная причина гонок

Откуда взялось shared? И да, shared mutable state не было уже в CSP.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от dmfd

50 лет назад параллелизма не было, и mutable state никого не волновал. Сейчас параллизм есть, и ваш «наиболее адекватный подход» с shared mutable state — это главная причина гонок. Поездов. С последующим крушением.

Это как бы в теории. А на практике всегда важен баланс. Вот например в Erlang нет никакого shared mutable state. Но народ жалуется, что дескать медленно.

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

Например, здорово передавать данные между потоками. Но как не крутись, для этого нужен shared state. Какой-то буфер обмена должен быть, может даже и lock-free. Беда обычно не в shared mutable state как в таковом, а либо в его кривой реализации, либо в более фундаментальных вещах типа priority inversion.

rtvd ★★★★★
()
Ответ на: комментарий от rtvd

Зарплаты вырасти не могут, с чего им расти, разве если перед этим инфляцию крутить, как в США.

Вопрос не в уровне зарплаты, а в уровне доходов, а доходы это не размер зарплаты, а на что этой зарплаты хватит.

Для мск 100кр увы мало, но и этому рад, т.к. не все получают и эту сумму в мск. Что касается других краёв - не знаю лично, но верю, что найти работу очень не просто, люди в других краях имеют не одну корочку, и даже знания имеют, но работают где случай подвернется, и далеко не по своим специальностям. К сожалению и в России такая же картина после Горби. Где случай подвернулся, там и работаем. «Капиталлизм» одним словом, при «коммунизме» вообще сложно было с работой, но говорят были времена хорошие до прихода Хруща, но я тогда еще и в проекте не был.

По любому правильно - где родился там и сгодился, поэтому другие края меня давно не манят :)

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от vertexua

Потому что она вообще нужна упоротым в языках в которых нельзя просто напросто сделать сайдэффект.

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

Shared-nothing architecture

И как её доказать средствами языка?

Any problems with that?

Да нет проблем. Просто не лезьте в треды про ФП со своим оффтопиком.

dmfd
()
Ответ на: комментарий от rtvd

Не поливал, разве что между строк читаете :), но я этого даже не подразумевал.

Разуму никого не поучаю, но и обижать ФП не стоит.

Нравится Вам scala, java, sql - да на здоровье.

Но опускать то что мне нравится, да еще с запутанной неубедительной аргументацией - не дам :)

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Вот вы тут Хаскели и Скалы обсуждаете, а я сижу и на Плюсах пишу и вам завидую.

anonymous
()
Ответ на: комментарий от tailgunner

Откуда взялось shared

Потому что это наиболее типичная ситуация.

dmfd
()
Ответ на: комментарий от dmfd

И как её доказать средствами языка?

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

vertexua ★★★★★
()
Ответ на: комментарий от dmfd

Да нет проблем. Просто не лезьте в треды про ФП со своим оффтопиком.

Тоесть когда речь заходит о возможностях, то оффтопик, а когда о палке в спицах колеса - то настоящее ФП

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

Вот я тут хаскель обсуждаю, а на плюсах не умею писать.

c: prgmati son

anonymous
()
Ответ на: комментарий от Deleted

Зарплаты вырасти не могут, с чего им расти, разве если перед этим инфляцию крутить, как в США.

В России нет инфляции?

В принципе, я смотрел по долларовому эквиваленту. Лет пять назад я видел в Москве вакансии где-то порядка $3K в месяц. 100K RUB это чуть больше чем $3K.

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

В принципе правильно. Но кто ищет, тот всегда найдёт.

По любому правильно - где родился там и сгодился, поэтому другие края меня давно не манят :)

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

rtvd ★★★★★
()
Ответ на: комментарий от Deleted

Но опускать то что мне нравится, да еще с запутанной неубедительной аргументацией - не дам :)

Может быть она запутанная и неубедительная, потому что Вы недостаточно знакомы с этой темой?

rtvd ★★★★★
()
Ответ на: комментарий от rtvd

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

Конечно всегда найдется кто-то лучше и Вас в том числе. Что - из этого расстраиваться? Нет - учиться, искать ответы на свои вопросы. ЛОР помогает в целом в этом, даже не смотря на отстутствие модерации. А Вам с вопросами относительно недостатков языков надо бы в специализированные конференции постить, а не сюда, а то выглядят Ваши доводы как заказные против ФП в целом, или чтобы новичков отвадить от ФП. Да еще и Ваши космополитические убеждения... пользы для России не несут.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от rtvd

не хочу говорить, что у хацкеля проблем нет, но эти мне показались переоцененными, тем более, что я считаю, что часть из них несущественна или решается просто. По поводу задачи и кода подробный комментарий и код будет завтра, я поддался собразну изучить линзы, которые я советовал, но которых я пока не знаю, да и за комп сегодня толком сесть не удалось. А по поводу твоего комментария, я посчитал, что он уровня комментариев vertexua, не разбирающегося в haskell, но любящего его посравнивать со скалой. Но лор, это лор, я рад что удалось перейти к предметной дискусии.

По поводу cabal-hell, тут ситуация сложная и интересная, но не настолько ужасная как её обрисовывают. Во-первых стоит отделять интересы интерпрайза, от интересов разработчика, хотя они и пересекаются, но в целом истоки разные. Интерпрайзу нужна минимальная стоимость (в т.ч. поддержки), максимальная быстрота и максимальная возможность получить денег с клиента. Программистру наиболее важно качество программы, время её создания и интерес работы. Естественно есть техники позволяющие получать не основные результаты, но рассматривать то, что дает экосистема языка нужно исходя из этого. Для интерпрайза хацкель хорош тем, что на выходе получается статически собранный бинарник, который можно положить в opt и забить на всё, но при этом нужно самому следить за багами и исправлениями зависимостей, а это сложно, при этом нельзя переложить ответственность на дистростроителей, из-за ABI; в новых кабалах появилась возможность указывать constraint и собирать пакеты в песочнице, это может помочь данному юзкейсу, но не является панацеей. Для разработчика есть несколько вспомогательных технологий: это сам кабал, и песочницы hs-env, и cabal-dev, плюс вспомогательные проекты, чтобы объединить сразу много проектов: cabal-meta, так же снойман придумал абсолютно ненужный local-hackage (наподобие того, что в генте но жестким хаком), но тут опять всплывает проблема ABI.

Проблема ABI это в том, что ABI зависит от интерфейса модуля и при изменении любой фунции, все обратные зависимости надо пересобрать. Эта проблема наиболее ярко проявляется в бинарных дистрибутивах, где нужно поставлять какую-то базу, и при этом не заставлять пользователя все перебирать самому. Поэтому обычно предоставляется платформа, и вокруг неё что-то, при этом разрабочтики на haskell среди девелоперов дистрибутивов встречаются не часто, со всеми вытекающими последствиями. В дополнение к проблеме API идет ещё одна проблема, что haskell комьюнити, считает, что stable API is nonsence и он часто меняется, при этом не все меняют 0.x версию, а некоторые умудряются даже перезалить версию на hackage, что безусловно является проблемой, но не проблемой языка. Некоторые не бекпортят исправления, в итоге их об этом просят (пример с tls и debian).

Что предоставляет gentoo поверх этой ситуации: у нас есть дерево (portage tree) и оверлей (haskell overlay), из которых можно взять ебилды (описание процесса сборки, метадата и патчи, сами пакеты. В портаже лежит платформа (слегка устаревшая, щас это исправляем), плюс зависимости конечнопользовательских програм, таких как git-annex, xmonad, pandoc, gitit, т.е. haskell пользователь может просто использовать пакеты и не париться. В оверлее лежат пакеты для девелоперов, там поддерживаются максимальные версии пакетов, которые совместимы между собой и собираются ghc с 6.12 по 7.6 и некоторые вплоть до 7.7 и live версии, (достигается это патченьем пакетов и исправлением зависимостей, могу расписать подробно если интересно). Плюс у нас есть полезные утилиты для обновления поломанных зависимостей (due broken dependency), автоматической генерации ебилдов и проверки целостности системы. В целом это позволяет многих даже не задумываться о необходимости песочниц, которые когда нужны удобно сочетаются с системным управлением пакетами. В общем как-то так.

qnikst ★★★★★
()
Ответ на: комментарий от vertexua

Дружище, не смеши, ты scalaz-то не осилил, что ты вообще можешь о скале знать? Зачем советовать то, в чем минимально не разбираешься?

anonymous
()
Ответ на: комментарий от qnikst

Нет, ну какие вы все-таки молодцы в gentoo-haskell. Большое спасибо вам за работу!

anonymous
()

Есть ощущение, что все слишком всерьёз воспринимают пердосторонинскую вонь !

anonymous
()
Ответ на: комментарий от anonymous

ха, ловко ты его подъебал, красава))

anonymous
()
Ответ на: комментарий от anonymous

Ну так идиот - самый удобный противник в споре.

anonymous
()
Ответ на: комментарий от bsdsarealldeadandrotting

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

вменяемый человек начинает расхлёбывать эту хуйню с сигнатур. которых нет

также не ясно нахуя было лезть в спермоленсы если всё равно есть срань вида

(\(a, b) -> a { _hunger = _hunger a - _points b }) $ zip as' fs'

шесть let'ов с портянкой навоза в каждой, в общем ничотак, бодренько

anonymous
()
Ответ на: комментарий от anonymous

аноним, ты заставил меня задуматься! был бы ещё не анонимом, вообще бы круто было.

qnikst ★★★★★
()
Ответ на: комментарий от anonymous

А что не так со стилем-то? То, что императивные дебилушки не могут в когнитивные способности, - не проблема хаскильбогов.

anonymous
()
Ответ на: комментарий от anonymous

Добавь сигнатуры, жить станет лучше, жить станет веселей

anonymous
()
Ответ на: комментарий от anonymous

побольше бы таких тредиков, спасибо

anonymous
()
Ответ на: комментарий от Deleted

выглядят Ваши доводы как заказные против ФП в целом

Точно ЗОЖ? Или ты конспиролог?

anonymous
()
Ответ на: комментарий от Deleted

Здоровый образ жизни - без...ГМО

отвратительно

jtootf ★★★★★
()
Ответ на: комментарий от qnikst

Да, на первое время gh хватает шикарно.

Когда каждые выходные делаешь emerge -avunD world, когда шуршишь haskell-updater'ом по вечерам чтобы он «всё починил» и так далее.

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

Сидишь себе в user-wide наборе пакетов, обновляешься раз в год, собираешь всё в cabal-dev'ах и вроде всё ок.

Единственное, gh хорош как собрание патчей и починок текущих сломанных пакетов. Воистину, совершенно чудесная подборка. Редакция газеты «ЛУЧШИЕ ПАТЧИ 2013», не иначе.

А если честно, я всё меньше и меньше понимаю необходимость среднему пользователю иметь все 500 dev-haskellных пакетов системвайдно. Даже хмонадо-тройку удобнее держать свеженькую с пылу с жару собранную из дарксорепы.

И ghc ставить скриптом приятнее. И кабал бутстрапить душевнее.

dmitry_malikov ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.