ДушкРи.Вн . 14з анимателэьснсыех оя зыкHеa skell и функциональном программировании Москва,2011 004.4 УДК ББК 32.973.26-018.2 Д86 ДушкинР.В. Д861 4з аниматеэлсьсоне яы зхы кHеa skиeф lуlн кционпарлоьгнроамм мир-Мо.вД:аМ нКи и. Прес2с0,1- 11.4 с0.и ,л . ISB9N7 8-54--9649017- 1 Вк нипгрее дста1в4сл теанатове тйо кроат,о врр ыаез нворееб мыял оип убликиолвпиао нды готовклп еунбыл икван цаиуич но-пожпуурлнядарлнлшяоек м о льнииу кчоивт е<л<еПйо тенци ал,С>т.а трьаис полоисж веянызт аанкыои бмр азчотмоо,бн ыпи р едстасволбялолойиг ически последовпаотвеелсьтнвоооетнв ача анлби оекл с елео жнтыемм аТма.кв жк ен исгдее луапнон ра практичзенсакнпииреяе ,д ларгеашеетмнснияое г пирхи клаздандыпахрчп и о моящзиы фкуан кционалпьрнооггроа ммиHрaоsвkаeнlиlя. Книбгуад иентт ервессенкмат,ж о и вион терефсуунектцсияо нпарлоьгнрыамм мированием, студетнетханми чВе сЗУко ипвхр, е подавателям информатики. УДК0 04.4 ББК3 2.973.26-018.2 Вспер ава заЛщюбиащяче ансыэт.ть ок йн ингеми о жбеытт вьо спроивзк ваекдбоыейт н она и бы лфоо римк еа кими быт он ибы лсор едстбевзпа имсиь мернанзоргеош велнаидяе лаьвцтеоврп сркаивх. Материизалло,ж евнд наынйнк онйи мгнео,г окпрраотвнеоНр оеп,но .с ковлеьркоуя ттнеохснтиьч оешсбиоккив хс е равснуош естивзудеатт,е нлемь осжтгеватор антиабрсоовлаютттьно учюн иоп сртаьв ильпнроисвтоьдс ивмеыдхеВ н ий. свясзэ ит иимз датенлеьн сетсоветотв етствзеавн онзомсотжоинш быикеис ,в язасни нсыпео льзоквнаингиие.м ©Д ушкРи.Вн . 2,0 11 ISB9N7 8-54--9649017- 1 ©О формлДеМнКиП ер е2с0с1,1 3 Принимаются благодарности Вниманвисюеч хи татеДлаенйн!ка няи гиаз давнэ ал ектровниндоиемр аспростраабнсяоелтюстян о бесплаВтын моо.ж етсев обоидснпоо льзеоёв атдчьлт яе никяо,п ировеаёт ьдд лряу зерйа,з мещать вб иблиотнеаск аайхт вас хе тИин тернреатс,с ылпаоэт лье ктропнончотийеп рип омощиин ысхр едств передианчфио рмаВцыим ио.ж еитсеп ользтоевкаксттнь и гчиа стиичлнипо о лносвтс ьвюо ирха ботах приу словриаиз мещеснсиыялн оако ригиинд аолл жнцоимт ировании. Приэ тоамв тобру денте сказраанднп оо лучичтиьт ательбслкаугюо даркноотсотрьпа,оя з волит каку лучшиттеьк сдта ннконйи гтиа,ки боклаечее ствпеондноой тпио дкг отсолвекдеу юкщниихг . Благодарпнроиснтиим аюнтасс чяё Ятн декс.Деннакь огтио,р мыойж нпое речисмлаилтуьлю е пту, и при помощи терминалов: 4100137733052 Убедителпьрноасяь пбраи;п еречислбелнаигио дарункоасзтыив ва тпьо яснекн ипие реводу наименоквнаингиииел ик акое-илниобуеок азаннаи ет оч,т оиз мае нвныор ажаебтлсаяг одарность. Оглавление Ота втора 7 Типовпорйо церсасз рабоптркоиг ранмаям з ыкHеa skell 8 Инструментсарлеьднс.ыт .ев а 8 Описапнриоец ерсасзар аботки 11 Функционалпьондыхйво п др ограммировании 15 Введе.н.и.е. ................ .... 15 Общисев ойсфтувнак цифйу нвк ционаялзьынкпыарххо граммирования 16 Примеорпыр еделфеунникцяи й 17 Заключение 21 Алгебраическдиаен нтывихя п зыы кHеa skell 22 Введе.н.и.е. .... 22 Простпыеер ечисления 23 Параметризация . . . . 25 Параметрипчоелсикмиойр. ф изм 27 Заключение 28 Объектно-ориентии фруонвкацниноонеа лпьрноогер аммирование 30 Введе.н.и.е. ......... . 30 Именовапнонлиыяс е т рук.т уры 31 Кластсиып ов 34 Экземплкялраыс сов 35 Окончатезлаьмнеычеа ния 37 Заключение 39 Введенви ле- исчислделняни аеч инающих 40 Введе.н.и.е. ........ . 40 Неформалоьпниосеат неиоер ии 41 Некотодроыпео лн.е н.и я. . . 43 Редуккцаискят ратвеыгчиияс лений 43 Примекроыд ировдааннинияыф ху нкц.и й 46 Заключение 51 Комбинато-рЭыт?оп росто! 52 Введе.н.и.е. ........ . 52 Формалтьеноаря.и я. . . . . . 52 Примесрлыо жнкыохм бинаторов 55 Модунлаья зыкHеa skдeлlяпl р еобразования комбинаторов 57 Оглавление 5 Представдлаенннииыф еху нкций 59 Булевзснкаичее .н ия 59 Нумералы Чёрча 60 Упорядочпеанрныы е 60 Общизеа мечания 61 Заключение 61 Ввоид в ывонда я зыкHеa skell 63 Введе.н.и.е. ......... . 63 Оснофвуын кционавлвьондоаг/ов ывода . 64 Стандарфтунныкецв ивио да/вывода .. . 66 Примепррыо гр.а м.м . .. .. .... . . 69 Выворде зульитсаптоолвн феунникяцн иаэи к ран 69 Альтернэактрииавлнафи :а йл 70 Копировфаанйилео в 71 Заключение 72 Простионйт ерпректоамтаонрд 73 Введе.н.и.е. ...... 73 Постановка задачи 73 Основннаобйфо урн кций 74 Вспомогаттеилпдьыан нынеы х 75 Цикилн терпре.т а.ц .и и. 76 Функцдилиия с полнкеонмиаян д 78 Заключение 80 Теоричяи сеил я зыHкa skell 81 Введе.н.и.е. .. 81 Простейшие задачи 82 Такинее простые чпирс.ол сат ые 83 ЧислМае рсенна . . . 85 ЧислФае рма . . . . . 86 ЧислСао фЖие рмен 86 Другпиоес ледоватперлоьснтчоыисхст еил 86 Совершенсптрвеуд енлеат 87 Заключение 89 Магическквиаед раит рые шенпиеер еборзнаыдха ч 90 Введе.н.и.е. ............ .. 90 Простевйашриийпа енрте бора 91 Перебиосрп осл ьзопвеарнеисетма новок 94 Перебиосрп осл ьзорваазнмиеещме ний 96 Дальнейушнаияв ерсалаилзгаоцриият ма 99 Заключе.н и.е . . . . . . . . . . . . . . 102 Задачоа ранце 103 Введе.н.и.е 103 Классичзеасдкаачяа 104 Реализраецшиеянн иаяя з ыке Haskell 105 Заключение 108 Оглавление 6 КриваДяр акона 109 Введе.н.и.е. ...... . 190 Чтот акКореи вДаряа кона? 111 Алгорпиотсмт ро.е .н и.я . 113 Реализнааця зиыяк Hеa skell . 113 Подготовиотпеилсьанныиея геометрических образов 114 ПостроКерниивеДо рйа кона. 116 Заключение 118 Немногшоа хом атнзыахд ачах 119 Введе.н.и.е. ......... . 119 Вспомогательныес упщрноогсртаим мные 119 Задаочр аа сстафниогвукре 122 Задаочх ао дкео н.я . . . . 123 Генерарцеикяу рсивснкыахз ок 126 Введение 126 Колобок. 127 Тере.м ок 131 Обобщефнуинек циип йо строгеенниеер атора 133 Репк.а. .. 136 Заключение 138 Литература 139 От автора В перисо 2д0 0п6о 2 00г9о дв образоватжеулрьннаодлмле яс таршекласис унчииктоевл ей <<Потен(цIиSа1Sл8N>1 4>- б6ы4л2ои2п )у бликиолвпиао ндыг отоквп луебнлыи кчаецтиыир нандацуачтньо популярныхо ф сутнактцеийо наплрьонгорма ммирио явзаынкHиеaи s kМeнlоlг.ии зед аннсытха тей нашлоип ределоётнкнлывийс ке рдицу амха чхи татеплоеэйт,о му баывлтроое ршоемсн вое ситхви о дну книгвуы,с трвоб иовл иелеми е нсетер ойную псоивсетсетмвуо вания. Вмесст ет емс ов ременнаич аплуаб ликанцаиуич но-попсутлаятрпенрйыо хш лдоо статочное количесвтрвеом ечнтио, биы языкH askelфlу,н киц ионаплрьонгореа ммирво вцаенлиоем эволюционипрооэвтанолемиоу,б хоида икмтау алиизнафцоирям апцрииив,е дееёвнб иоел сеоев ременный видВ.с эёт зон ач,чи ттвон астоякщнеийиг сех одснтыаетн ьети о льнкепо р иведвие снхыо дпноормя дке публикнаоци и инв,е котосрлыухч даоясхт атсоечрньоёп зенрое работаны. Книгбау дпеотл ешзкноал ьнситкаармш килха ссжоивви,он тересуиюнщфиомрсмяа итс имкеожйн ыми областняамуик ии техниак ит,а кжуеч ителкяомт,о рпырео водфяатк ультатзиавнняытеи я пои нформаит иккоем пьютегррнаомйо тнКорсотмите.о го,н адяе ючстьо,к нигтаа кжбеу дет полезстнуад енттеахмн ичевсыксишхиу хч ебнзыахв едекноитйо,рх ыоет еблыио владпеотньи манием функционального првоц герлаоиммя м зиыркHоаaв sаkнeчиlаяlс твн оНсуит ил.вю босмл учканеи га станнеетп лоихситмо чниидкеозйма, д аич и хр ешендилйяв секхт,ои нтересфууентксцяи ональным программированием. Я выражсааюм усюе рьёзбнлуаюг одарвнсоемсмот иькм о ллекгоатмо,р вы ет ой иниолмйие ре способстпвооявваллеимн ниоюг иизхп риведёвн кнныихгс ет атнеайс веОтс.о бсот оиотт метить АнтонюДк.Аа . и АстапДо.в а (Ев.т омч ислие ква честве речцьеибн езсеснмтеасн)он,вы еет ы и предложпеону иляу чшевнсиеюг пдраи ходиклситсаьтТ иа.к жхео чвуы разибтльа годарность всемкуо ллектриевдуа кцжиуир на<л<аП отензцаие аглос> а>м оотвержтернунндаы п йо прище просвещиеп ноипяу ляринзаауцксиири е пдоид растапюощкеоглоеО нтидяе.л хьонтое лбоыос тьм етить ВорожцАо.в арВ е.д,а коттодреа<л <аИ нформатика>>. Будкур айпнреи знатлеюлбеынкм о нструкткиовмнмыемн тазраимяемч,а нии пярме дложениям, котормыоеж нпор исылпаоат дьр еэслуе ктропнончотйы rdoumsahnk.i n©сgотmТ.a аiкlж.пе оэ тому адремсоуж нпор исылзаатпьр онсафы а йлсы и сходнкыомдиа пмрии мерпорви,в едёвн кнныихг е (указыпвоажйатлеу,нй аситмае,н оэвсасднели,кяя о торых невоыбсхлоиадстихьмо одк ноыдпеыр имеров). В добрпыуйт ь. ДушкшРt.В . Моск2в0а1,1 . Типовпорйо церсасз рабпортокгир амм на языке Haskell Сmаmъ.я;б илап одгоmов.пп, пеунба.п ,ипавц оидии ни зн омеро=ву рна.п<,<аП отенцива пло,н>ц 2е0 09 года. Опуб.п,ипонвеба ынлаа . В эссреа ссказывоа теитпео.вяоп мр оцерсасзер абоптркоиг раммснрыехд снтавф ункицоналъ.няозмы ке программирHоaвsаkнeиОlяпl и.с ываюнтескяо тоирзыи ем еющихнсаят екущи.мйо менптр ограммных средсити вн струментов, деларюащзирха бппорртоокцсиет сиысб м ы стрыДма.ё тск.ряа тксау.мям арна.я информаоц итяо м,г деи нкаа киухс лови.мяох:н снпоо лу-чивтеъс нъ еобходидмлыярй а боты инструмаернитй. В дальнейшем ивз нлаосжтеонякищниеи йгп ер иводряатзсняо образнейишзио еб лзаасдтаич и математии икниф орматаи ткаик,ж оеп исыварюетшсеян эитяи зха дапчр ип омощяиз ыка функционаплрьонгоргаом миHрaоsвkаОeнпlиыlяот .б щенаивят осрч аи татеплоякмаизч атлио,м еется проблнеемпао средственно прак-тимчнеосгчкииоетг аот пехрлаоирс натекоз т неарючатт ,од елать сп риводипмрыиммие риаи мсих однкыомдиа кмтию:ий н струментарий киасккпо омлпьизлоивраотвьа,т ь програкмамзкыа ,г руждаотпьо лнитпеалкьенитыт ые.д . Осмыслепнриоеб лепмрыи велпоо нки матноигюо ,я зчытHкоa skпeрlиlв сеехг од остоинствах очеснльо жвнхоо двир ту сплроа ктичиесспкоолгьоз оквалакюн биият елтяамикип ,р офессиональными программистами. В связин еосб хоэдтиивмм ио ссвптооьзл ньизконавоеавтно пийаи р адигмы популярияззаыцкHиаaи s kиe lфlу нкционаплоьднхоогвдо па р ограммир(оввпаенриввивы еед ена вк ни[г8е] ). Даннпааяр адипгрмеад полнаегоабехто дивмсоесмтеьрр наосгпор острзаннаенинии ийня ф ормации о практичессркеидсхт ив маехт одраахз рабоат ткеио,р етиччеассктаья мбоыжтепьто лучена заинтересолвюадньнмысима им остоятбеллаьгноло и,тв ераитмуерненп оот еоретиччеассктоий недостнаеттк а( тсоммч. и свкл неи г[и67 ,,1 4, 1165]Э,)т .ош та гп озвонлаи тп ервонаэчтаалпьен ом заинтереис очвеиарнтетьзе прреисв лкеф чуьн кциональному прмонгоржаемснмтеиворофо ивтаонви.ю Данноэес соеп исывтаиепто впорйо церсасз рабпортокгир аммного сярзеыдкHсеaт sвkаe llн а на припмреорсет ейпшреиглоо же<н<иHяe llo,С лwоoжrнlоdрс!ат>зь>р .а батывпареомгоргаомм ного средстзвдае ссьо вершенниом еензтен аченпиояс,к олоьбкруи совываются именно процесс и инструментарий. сЧаимтоасттеоляпьтр еилвмьоенлноеоя нпт иьс ываве мыреа зделе средства дляр ешенпиряо извозлаьднаыхчхо, тб яы и д ляр ассмотпрреинмиеявр с олве дуюэщсисхе , входящих вс остканви ги. Инструментаслрьендысет ва Весньа бионрс труменстраелдьиснстыпвхо, л ьзвур еамбыонхта елд ю быпмр оектом,р азмдоежлниот ь нак ласЭстыоо. т носниетт соял ьккя оз ыкпур ограммиHрaоsвkанeноlи lяи, л юI<б одмруу гоямзуы ку Инструментсарлеьднсытев а 9 программирвопвраончкиеаямк,и, лкю быимн ыпмр оек-таомтп роектирдоевтаснкииогяйр ушки доп остргоойркоиВд п ар.и нцриапзед,е нлаик тльа сисныс труменстраелдьсндтылвреяаа ботяыз ыск ом Haskмeоlжlнт оа кк,а пко казнаарн иос . 1. r---------------------------------------,- система IDE Отлдачик справки Сборка пр nероесцсор документации Програмнмый Идея Контроль продукт I Транслятор версий Оптимизатор И wтасллтяор Библтиеоки Рис. Ки1б.е рнетичсехсекмапаяр еобразовиаднеивияз аконченпнрооег раммснроеед ство Такжиен струмемнотжанркоил йа ссифицпиорс отвеапптеоьнл ие знион сетоиб ходиНмеоксоттио.р ые класисныс трумоебнытчоннвеои спольз(упюртеспяр оцделсяяс зоыркHыаa skиeсlпlо льзруеюдтксоя) , а бепзр,и мк,ет рруансляятзоырквоаов о бнщеев озмообжонйот Тиасчкьт .о нитжаеб лвпи ецрее числены наибочлаесеит соп ользиунесмтыреу менстраелдьснктыовета о,рп ыоед ходдлякята ждоргаоз работчика, длляю бопгроо екта. 1 нструмент �писание 1� КомпиляGтHоCр Самыйм ощныий совершекнонмыпйи лятор, нас егоднядшенниньйе имеюащниайл о-гов, GHC. Реалитзоулеьтск тона ен дHаaрsтk ell- 98, нмон ожие сртавсош иреянзиыйкм ан,о гие из которых сутжаен дсадтреат-лофима Икмтеое.т возможнроасбтоьвт ыр ежимиен терпретации ( в составвх опдоииснттт аевркпир еGт На тCоiр) . http://www.haskell.org/ghc/ ТестироQвuаiнcиkеC hecДkл я проведентиеяс тироваонбиыяч но используютсспяе циальнбыиеб лиотеки вродQеu ickChОeнcиk . позвсоолзядюатв ать семантичперсаквииоелп аи,с ывапюощвиеед ения функцви й проепrо<сТлчеее, г зоа пускэаттиь правинлапа р овесрр кауз личанрыгмуим ентами. Проверкоас уществлякеотмспяи лятором в процсебсосрпекр ио граммы. http://www.md.chalmers.se/-rjmh/QuickCheck/ Прдоолже'l-t'l-tиaСJtе е дующеcйm pa'l-tuцe