LINUX.ORG.RU

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

 ,


3

5

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

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

★★★★

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

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

Про 200К USD это не на долго к сожалению еще осталось, да и получают эти деньги в мире немногие избранные, остальные же, ничем не хуже, не могут найти работу по найму нигде по специальности из-за «отсутсвия опыта», даже имея не один диплом и личные знания, они то в чем виноваты? рынок труда ? личная глупость? и работают в фастфуде или клерками в банках ;), чтобы рассчитаться за кредиты на «образование».

Кроме того не нужно забывать что такое USD/EUR и США или Европа. Поэтому мне и на Родине в России хорошо :) и думаю будет еще лучше в самое ближайшее время и не только мне но и всем соотечественникам, так как неправедным путем Россия не пойдет на этот раз, хватит с простых людей «проектов» - «перезагрузка», «перестройка», «оттепель» и прочих «революций» в «одни ворота» в пользу избранных.

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

ФП это пока всего лишь моё хобби-увлечение. Возможно станет и работой после 2014-2016 года, а я сам еще и работадателем. Gentoo осталась пока на единственном сервере, которым я располагаю на данный момент. На ноутбуке, и desktop-е теперь только NixOS - тоже можно считать ее ещё одним моим хобби.

Риски всегда есть, например диски откажут и т.п. Поэтому нужны резервные копии. Но для инфраструктуры Haskell на Gentoo они не нужны. Но всё равно, как уже писали, на рабочих машинах я бы не стал что-либо обновлять, прежде чем не прокатал бы решение на тестовом сервере.

При обновлениях в идеале надо не только release notes и changelog читать, но еще в код лезть с ревизией, если этот код используется в ответственных приложениях :(. Времени естественно на это никогда и не будет, поэтому в определенной мере доверяю разработчикам кода и бдительному сообществу.

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

Что до интересов enterprise и интересов разработчика - предпочитаю чтобы они пересекались

все так хотят, но имхо это редкость. Т.е. делая приложение в хацкеле нужно понимать, что взять и забросить его нельзя, иначе оно станет неюзабельным сравнительно быстро (раз в 0.5-1.5 года, придется приводить его к адекватному виде) и будет жить в песочнице.

А что до ABI, то мне не совсем ясно, почему его так нужно ломать даже если не меняются сигнатуры экспортируемых штуковин (типов, функций, etc.).

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

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

1. Попробовал добавить ещё один тип и линзу:

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

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

с гентой в production вполне можно, при этом чем больше однородных машин, тем выгоднее. Существуют некоторые нестрандартные проблемы, которых в других дистрах нет, что усложняет работу если в других дистрах проблема решается адекватно, или сильно упрощает если в другом дистре проблема не решена. Основное, что надо понимать с гентой, то, что правило «работает - не трогай» вредное, и а нужно «работает - составь план обновления», т.е. относительно всего ключевого софта нужно понимать, когда его следует обновлять, напр. openvz следует держать версии на 3 ниже старой, либвирт обновлять через неделю после выхода версии, при этом админ должен промониторить, что всё адекватно поднимется (причем это не гентупроброблемы). В целом держать генту в production вполне можно, главное, чтобы админ понимал, что он делает и зачем, и документировал действия.

P.S. там где я работаю, production не на генте, но я и не админ и не хочу в это лезть.

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

комментарии по коду приветствуются, там есть n кривых мест, но не знаю доберусь ли я до того, чтобы их поправить.

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

ФП это пока всего лишь моё хобби-увлечение.

Вот именно.

А для меня это инструмент, которым я пользуюсь для работы уже лет пять-шесть.

И тем не менее, у тебя есть наглость учить меня уму-разуму. Это очень симптоматично.

Возможно станет и работой после 2014-2016 года, а я сам еще и работадателем.

Мечты-мечты.

Риски всегда есть, например диски откажут и т.п. Поэтому нужны резервные копии. Но для инфраструктуры Haskell на Gentoo они не нужны. Но всё равно, как уже писали, на рабочих машинах я бы не стал что-либо обновлять, прежде чем не прокатал бы решение на тестовом сервере.

Это всё прекрасно, но полагаю ты не отвечаешь лично на безупречную работу десятков-сотен серверов с кучей софта, написанного как сторонними разработчиками, так и тобой. И у тебя не будет проблемы, если что-то станет раком на пол часа. У меня же даже секунда простоя это большая проблема. А уж глюки и подавно.

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

При обновлениях в идеале надо не только release notes и changelog читать, но еще в код лезть с ревизией, если этот код используется в ответственных приложениях :(.

Это верно.

Времени естественно на это никогда и не будет, поэтому в определенной мере доверяю разработчикам кода и бдительному сообществу.

Я последний раз доверял лет 15 назад.

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

Кроме того не нужно забывать что такое USD/EUR и США или Европа. Поэтому мне и на Родине в России хорошо

Это хорошо, что тебе в России хорошо.

Но не следует забывать, что в той же Индии деньги стоят ещё дороже. Можно туда переехать. Зарплата меньше, но и траты тоже меньше. Чем не вариант?

«проектов» - «перезагрузка», «перестройка», «оттепель» и прочих «революций» в «одни ворота» в пользу избранных.

Давно стоило уже понять, что всё всегда идёт в «одни ворота». «Ворота» тех, у кого есть сила. Перестройки часто даже не меняют местоположение «ворот», разве что вывеску на них.

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

все так хотят, но имхо это редкость. Т.е. делая приложение в хацкеле нужно понимать, что взять и забросить его нельзя, иначе оно станет неюзабельным сравнительно быстро (раз в 0.5-1.5 года, придется приводить его к адекватному виде) и будет жить в песочнице.

Да, это тоже проблема. Цена поддержки высока даже если не хочешь ничего менять.

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

Можно бороться. А можно и не бороться. Я предпочитаю не бороться, поэтому мой софт на haskell это как правило утилитки, от которых не ожидается, что они будут долго жить. Написал, попользовался, забыл.

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

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

Разве более классический варинт не такой: держать по модулю на тип данных (с линзами) и делать им fully qualified import всегда, когда есть конфликт имён?

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

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

Да, это тоже проблема. Цена поддержки высока даже если не хочешь ничего менять.

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

Можно бороться. А можно и не бороться. Я предпочитаю не бороться, поэтому мой софт на haskell это как правило утилитки, от которых не ожидается, что они будут долго жить. Написал, попользовался, забыл.

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

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

Разве более классический варинт не такой: держать по модулю на тип данных (с линзами) и делать им fully qualified import всегда, когда есть конфликт имён?

видимо я неточно выразился, т.е. я это и имел ввиду, стандартный метод это модуль на тип и qualified import, если он не работает/не удобен, то префиксы. Например, иногда мне хочется иметь модуль Foo.Types, который будет экспортировать все нужные типы, в этом случае я могу предпочесть использование префиксов.

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

PS. То что ЛОРцы пишут здесь по-русски, еще не значит что они из России, и тем более не значит, что они продвигают ФП. Мне показалось, что в этом треде всё направлено на опускание ФП, особенно в России, и самой России.

Не секрет, что вокруг - одни враги.

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

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

А зачем, кстати, отдельный модуль с типами?

Не знаю зачем. Ведь проще вообще весь код в однин модуль кинуть. В том же C модулей нет, всё инклюдишь и вперде.

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

а почему его нужно не ломать?

А это кредо такое - ломать всё, невзирая на обстоятельства? Чётко.

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

Для меня странно, что выбран для обсуждения вычурной учебной программы топик посвященный новой книжке о Haskell для начинающих. Пример с линзой случаем не из книжки ? Если нет, то тем более не понятно, зачем он здесь и с какой целью обсуждается? Неужели в конференциях места не хватило или почтой/im нельзя было с anonymous «перетереть» сборку линзы :)

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

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

видимо я неточно выразился, т.е. я это и имел ввиду, стандартный метод это модуль на тип и qualified import, если он не работает/не удобен, то префиксы. Например, иногда мне хочется иметь модуль Foo.Types, который будет экспортировать все нужные типы, в этом случае я могу предпочесть использование префиксов.

ОК. Но надеюсь ты не будешь спорить, что запись вроде

world.animals[animal_id].organs[Heart].temperature

будет несколько компактнее аналогичной в haskell, пусть даже с линзами но с qualified names?

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

Впрочем, у каждого свои критерии простоты и красоты. Кому-то нравятся яблоки, кто-то предпочитает груши.

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

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

А я обожаю и место жительста и место рождения. И патриот я просто до глубины души. И мой патриотизм заключается в том, что я живу в другой стране и не даю паразитировать на себе тем, кто разрушает мою Родину. :-)

Но это уже оффтоп.

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

Слушай, а просто для информации, где сейчас 200+ платят? Я смотрел зарплаты в интернете не так давно по всяким гуглам, фейсбукам, интелам и т.п., и что-то не видел выше 150 даже у сениор инженеров. Другой аноним.

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

Слушай, а просто для информации, где сейчас 200+ платят? Я смотрел зарплаты в интернете не так давно по всяким гуглам, фейсбукам, интелам и т.п., и что-то не видел выше 150 даже у сениор инженеров. Другой аноним.

Wall Street, но далеко не везде. Зарплаты эти редко афишируются. Но когда shit hits the fan, но можно увидеть цифры.

Вот пример:

http://en.wikipedia.org/wiki/Sergey_Aleynikov

Да, пример неудачный. Мужик зарабатывал больше чем $200K в год.

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

Wall Street, но далеко не везде. Зарплаты эти редко афишируются

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

Да, пример неудачный. Мужик зарабатывал больше чем $200K в год.

Да, у Гольдмана взыграла очень сильная попаболь, а пацан-то к успеху шел!

anonymous
()
Ответ на: комментарий от rtvd
world.animals[animal_id].organs[Heart].temperature

Да, поносненько получается как-то:

world^.animals^?!ix animal_id^.organs^..folded.filtered (has _Heart)^..folded.temperature

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

будет несколько компактнее аналогичной в haskell, пусть даже с линзами но с qualified names?

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

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

скорее для индексируемых (где можно выделить численный индекс) и вложенных структур - да, для zipper-like наверное лучше сами zipper-ы использовать, хотя возможно я пропустил моменты в api относящиеся к zipper.

P.S. приведенное мной решение принимаешь, или надо что поправить?

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

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

Но всё же не покидают некоторые сомнения касательно того, можно ли lens использовать без риска сломать голову. Вот смотри:

это список всех определений в lens

Не кажется ли реалистичным, что используя lens и какую-нибудь другую библиотеку (ну типа реализации generalised zipper или graph library), можно нарваться на конфликт имён не только по обычным идентификаторам, а и по операторам?

Как только это произойдёт, то карета превратится в тыкву конструкции вида

w ^. animals ^.. folded.filtered (\a -> a^._2.age.to (>16))

превратятся в что-то типа

w L.^. animals L.^.. folded.filtered (\a -> a L.^.L._2.age.L.to (>16))

В принципе, я легко теряюсь и в первом варианте, но во втором мне точно хана.

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

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

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

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

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

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

Есть какие-то языки, в которых нормальные траверсирования структур записываются проще?

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

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

Может он это и делает, но например оператор & есть ещё и в fgl. Это так, сходу. Может есть и другие потенциальные конфликты.

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

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

Во-первых запись не моя.

А во-вторых мне мутабельность не мешает. Особенно если она работает понятным и локализованным образом.

Есть какие-то языки, в которых нормальные траверсирования структур записываются проще?

Такого, чтобы мне нравился, точно нет. Везде свои грабли.

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

rpmки с ghc херово на венду ставятся...

haskell platform нативная для венды

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

Тогда таких 99.99% населения планеты, так как никто из них не может найти работу на 200К $ в год, и я среди них :)

Но почему-то меня это ни сколько не расстраивает и не заботит.

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

Бегло пролистал... вроде как обычная стандартная методичка. Зачем писать спрашивается, если и так уже достаточно? Например то же «мягкое введение в haskell».

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

Что за бред? У многих очень интересных вакансий в пожеланиях есть знание функциональных и логических языков(в частности haskell). С таким успехом можно выбрать другую крайность и сказать, что Все должны учить PHP. Вообще знание и понимания ф.п. влечет более изящные решения множества любых других задач.

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

Например, селектел пишет многое на хаскеле

Предполагаемые средства решения — в зависимости от сложности и нагрузки — python, ocaml, haskell, erlang.

http://blog.selectel.ru/programmist/

Вроде бы у http://www.parsci.com/home есть разработчики в россии, по крайней мере зефиров работает там.

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

Не кажется ли реалистичным, что используя lens и какую-нибудь другую библиотеку (ну типа реализации generalised zipper или graph library), можно нарваться на конфликт имён не только по обычным идентификаторам, а и по операторам?

Это возможная проблема, навскидку я вижу несколько пересечений с System.Directory/Filesystem.Directory. В подобных случаях я обычно прячу, операторы из библиотеки, которая меньше используется, либо использую квалифицированный импорт в дополнение к обычному, хотя у меня таких случаев не много было, Filesystem+PrettyPrint+Monoid+Conduit, в них местами пересечения были.

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

дебилушки не могут в когнитивные способности

Часто замечаю на ЛОРе: «X умеет Y», «X не может в Y» и т. п.

Это с какого села такие гении?

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

Зашел разговор о линзах, раньше не был знаком с ними, было круто если бы они в Scala генерировались компилятором, иначе руками их писать больно

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

В скале нет и никогда не будет ничего похожего на lens. Максимум, в отрыжке от Хаскеля ты можешь познакомиться с аналогом data-lens.

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

Нету, запихнуть в нее еще шаблоны, точно треснет

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

Потому что сломанный субтайпингом инференсер не тянет нормальные ленсы :( , и пользоваться ими становится невозможно. Обычная, в общем, для скалы ситуация.

Даже Эдвард забил пытаться!

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

Не, ты не понял.

data-lens style ленсы утомительно писать руками (и это то, что есть в скале), поэтому без TH никуда.

lens style ленсы легко и просто писать руками, поэтому TH там для удобства и только. Их никогда не будет в скале, потому что в скале нерабочий инферер.

Чтобы понять в чем проблема, можешь скопировать http://twanvl.nl/blog/haskell/cps-functional-references на скале и оценить неюзабельность.

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