Дар мохи июни соли чорй дар шахри хурди Швейцария Рапперсвиль вокеае ба вукуъ омад
Дар бораи мо
Ин мақоларо ду донишҷӯи курси 3-юми барномаи «Математикаи амалӣ ва информатика»-и Мактаби олии иқтисодии Донишгоҳи миллии тадқиқотӣ – Санкт-Петербург: Василий Алферов ва Елизавета Василенко омода кардаанд. Шавқу ҳавас ба барномасозии функсионалӣ барои ҳардуи мо аз як силсила лексияҳои Д.Н.Москвин дар соли 2-юми донишгоҳ оғоз ёфт. Василий дар айни замон дар барномаи Google Summer of Code иштирок мекунад, ки дар доираи он бо роҳбарии гурӯҳи лоиҳа графикҳои алгебравиро дар Ҳаскелл амалӣ мекунад.
Формати чорабинӣ
Шунавандагони мақсаднок соҳибони лоиҳаҳои кушодаасос, барномасозоне, ки мехоҳанд дар таҳияи онҳо иштирок кунанд, муҳаққиқони барномасозии функсионалӣ ва одамоне, ки ба Ҳаскелл дилчасп ҳастанд. Имсол, таҳиягарон аз беш аз панҷоҳ лоиҳаи кушодаасоси Ҳаскелл аз тамоми ҷаҳон дар макони баргузорӣ - HSR Hochschule für Technik Rapperswil - ҷамъ омаданд, то дар бораи маҳсулоти худ сӯҳбат кунанд ва одамони навро ба рушди онҳо таваҷҷӯҳ кунанд.
Акс аз Twitter
Нақша хеле содда аст: ба шумо лозим аст, ки пешакӣ дар бораи лоиҳаи худ якчанд пешниҳод нависед ва онҳоро ба созмондиҳандагон фиристед, ки онҳо дар саҳифаи чорабинӣ маълумотро дар бораи лоиҳаи шумо ҷойгир мекунанд. Илова бар ин, дар рӯзи аввал муаллифони лоиҳаҳо сӣ сония доранд, то аз саҳна хеле мухтасар нақл кунанд, ки чӣ кор карда истодаанд ва чӣ бояд кард. Баъд шахсони шавкманд муаллифонро чустучу карда, дар бораи вазифахо муфассал пурсон мешаванд.
Мо то ҳол лоиҳаҳои кушодаи худро надорем, аммо мо воқеан мехоҳем дар лоиҳаҳои мавҷуда саҳм гузорем, аз ин рӯ мо ҳамчун иштирокчиёни доимӣ сабти ном шудем. Дар давоми се рӯз мо бо ду гурӯҳи таҳиягарон кор кардем. Маълум мешавад, ки омӯзиши муштараки код ва муоширати зинда ҳамкории байни муаллифони лоиҳа ва саҳмгузоронро хеле самаранок мегардонад - дар ZuriHac мо тавонистем соҳаҳоеро, ки барои мо нав буданд, бифаҳмем ва тавонистем ба ду дастаи комилан гуногун кӯмак расонем ва дар ҳар як як вазифаро иҷро кунем. аз лоихахо.
Дар ZuriHac гайр аз тачрибаи пуркимат, инчунин якчанд лекция ва дарсхои устодон хонда шуданд. Мо махсусан ду лекцияро дар хотир дорем. Дар нахуст аз онҳо Андрей Мохов аз Донишгоҳи Нюкасл дар бораи функторҳои интихобӣ-апликативӣ - як синфи намудҳо, ки бояд байни функторҳои аппликативӣ ва монадаҳо миёнарав шаванд, сухан гуфт. Дар лексияи дигар, яке аз асосгузорони Ҳаскелл Саймон Пейтон Ҷонс дар бораи чӣ гуна кор кардани хулосаи тип дар компилятори GHC нақл кард.
Лексияи Саймон Пейтон Ҷонс. Акс аз Twitter
Дарсҳои маҳорат дар ҳакатон вобаста ба сатҳи омодагии ширкаткунандагон ба се категория тақсим карда шуданд. Вазифаҳое, ки ба иштирокчиёне, ки ба таҳияи лоиҳаҳо ҳамроҳ шудаанд, низ бо дараҷаи душворӣ қайд карда шуданд. Ҷамъияти хурд, вале дӯстонаи барномасозони функсионалӣ навкоронро дар сафҳои худ бо хушҳолӣ истиқбол мекунад. Барои фаҳмидани лексияҳои Андрей Мохов ва Саймон Пейтон Ҷонс, аммо курси барномасозии функсионалии мо дар донишгоҳ хеле муфид буд.
Бақайдгирӣ дар чорабинӣ ҳам барои иштирокчиёни доимӣ ва ҳам барои муаллифони лоиҳа ройгон аст. Мо барои иштирок дар аввали моҳи июн дархост пешниҳод кардем, ки пас аз он моро зуд аз рӯйхати интизорӣ ба рӯйхати иштирокчиёни тасдиқшуда интиқол доданд.
Ва ҳоло мо дар бораи лоиҳаҳое сӯҳбат хоҳем кард, ки дар таҳияи онҳо иштирок кардем.
Пандок
Рӯйхати форматҳои ҳуҷҷатҳое, ки аз ҷониби Pandoc дастгирӣ мешаванд. Дар сайт инчунин як графики пурра мавҷуд аст, аммо ин расм ба мақола мувофиқат намекунад.
Албатта, Pandoc табдили мустақимро барои ҳар як ҷуфт формат таъмин намекунад. Барои дастгирии чунин намуди васеи дигаргуниҳо, ҳалли стандартии меъморӣ истифода мешавад: аввал, тамоми ҳуҷҷат ба муаррифии махсуси дохилии мобайнӣ тарҷума карда мешавад ва сипас аз ин муаррифии дохилӣ ҳуҷҷат дар формати дигар тавлид мешавад. Таҳиягарон намояндагии дохилиро "AST" меноманд, ки маънои дарахти абстрактии синтаксисиро дорад ё
$ cat example.html
<h1>Hello, World!</h1>
$ pandoc -f html -t native example.html
[Header 1 ("hello-world",[],[]) [Str "Hello,",Space,Str "World!"]]
Хонандагоне, ки бо Ҳаскелл ҳадди аққал каме кор кардаанд, аллакай метавонанд аз ин мисоли хурд тахмин кунанд, ки Pandoc дар Ҳаскелл навишта шудааст: баромади ин фармон як намоиши сатри сохторҳои дохилии Pandoc мебошад, ки ба монанди он, ки он одатан иҷро карда мешавад, сохта шудааст. дар Хаскелл, масалан, дар китобхонаи стандартӣ.
Ҳамин тавр, дар ин ҷо шумо мебинед, ки намояндагии дохилӣ сохтори рекурсивӣ мебошад, ки дар ҳар як гиреҳи дохилии он рӯйхат мавҷуд аст. Масалан, дар сатҳи боло рӯйхати як элемент мавҷуд аст - сарлавҳаи сатҳи аввал бо атрибутҳои "салом-ҷаҳон",[],[]. Дар дохили ин сарлавҳа рӯйхати сатри "Салом" ва пас аз фосила ва сатри "Ҷаҳон!" пинҳон карда шудааст.
Тавре ки шумо мебинед, намояндагии дохилӣ аз HTML чандон фарқ надорад. Ин дарахтест, ки дар он ҳар як гиреҳи дохилӣ баъзе маълумотро дар бораи форматкунии насли худ медиҳад ва баргҳо мундариҷаи воқеии ҳуҷҷатро дар бар мегиранд.
Агар мо ба сатҳи татбиқ гузарем, намуди маълумот барои тамоми ҳуҷҷат чунин муайян карда мешавад:
data Pandoc = Pandoc Meta [Block]
Дар ин ҷо Блок маҳз қуллаҳои дохилии дар боло зикршуда мебошанд ва Мета мета-маълумот дар бораи ҳуҷҷат, ба монанди унвон, санаи таъсис, муаллифон - ин барои форматҳои гуногун фарқ мекунад ва Pandoc кӯшиш мекунад, ки агар имконпазир бошад, ин маълумотро ҳангоми тарҷума аз формат ба формат нигоҳ дорад. формат.
Қариб ҳамаи конструкторҳои навъи Блок - масалан, Сарлавҳа ё Параграф (параграф) - атрибутҳо ва рӯйхати қуллаҳои сатҳи поёниро ҳамчун аргумент мегиранд - Inline, чун қоида. Масалан, Space ё Str конструкторҳои навъи Inline мебошанд ва теги HTML низ ба Inline махсуси худ табдил меёбад. Мо пешниҳоди таърифи пурраи ин намудҳоро ҳеҷ маъно намебинем, аммо қайд кунед, ки онро дар ин ҷо пайдо кардан мумкин аст
Ҷолиб он аст, ки навъи Pandoc як моноид аст. Ин маънои онро дорад, ки як намуди ҳуҷҷати холӣ вуҷуд дорад ва ҳуҷҷатҳоро якҷоя ҷамъ кардан мумкин аст. Ин барои истифода ҳангоми навиштани Readers қулай аст - шумо метавонед ҳуҷҷатро бо истифода аз мантиқи ихтиёрӣ ба қисмҳо тақсим кунед, ҳар яки онро алоҳида таҳлил кунед ва сипас ҳама чизро дар як ҳуҷҷат ҷамъ кунед. Дар ин ҳолат, метаинформатсия аз тамоми қисмҳои ҳуҷҷат якбора ҷамъ карда мешавад.
Ҳангоми табдил додан, масалан, аз LaTeX ба HTML, аввал модули махсус бо номи LaTeXReader ҳуҷҷати воридшударо ба AST табдил медиҳад, баъд модули дигар бо номи HTMLWriter AST-ро ба HTML табдил медиҳад. Ба шарофати ин меъморӣ зарурати навиштани шумораи квадратии табдилҳо вуҷуд надорад - барои ҳар як формати нав навиштани Reader ва Writer кифоя аст ва ҳамаи ҷуфтҳои имконпазири табдилҳо ба таври худкор дастгирӣ карда мешаванд.
Маълум аст, ки чунин меъморӣ низ камбудиҳои худро дорад, ки онро коршиносони соҳаи меъмории нармафзор кайҳо пешгӯӣ кардаанд. Муҳимтар аз ҳама арзиши ворид кардани тағирот ба дарахти синтаксис мебошад. Агар тағирот ба қадри кофӣ ҷиддӣ бошад, шумо бояд кодро дар ҳама Хонандагон ва Нависандагон иваз кунед. Масалан, яке аз мушкилоте, ки таҳиягарони Pandoc дучор меоянд, дастгирии форматҳои мураккаби ҷадвал мебошад. Ҳоло Pandoc метавонад танҳо ҷадвалҳои хеле соддаро бо сарлавҳа, сутунҳо ва арзиш дар ҳар як чашмак созад. Масалан, атрибути colspan дар HTML танҳо нодида гирифта мешавад. Яке аз сабабҳои ин рафтор мавҷуд набудани схемаи ягонаи муаррифии ҷадвалҳо дар ҳама ё ҳадди аққал бисёр форматҳо мебошад - мувофиқан маълум нест, ки ҷадвалҳо бояд дар тасвири дохилӣ дар кадом шакл нигоҳ дошта шаванд. Аммо ҳатто пас аз интихоби намуди мушаххас, ба шумо лозим меояд, ки комилан ҳама Хонандагон ва Нависандагонеро, ки кор бо ҷадвалҳоро дастгирӣ мекунанд, иваз кунед.
Забони Ҳаскелл на танҳо аз сабаби муҳаббати бузурги муаллифон ба барномасозии функсионалӣ интихоб карда шуд. Ҳаскелл бо қобилиятҳои васеи коркарди матн маълум аст. Як мисол китобхона аст
Ба таври мухтасар тавсиф карда мешавад, ки монадҳо барои таҳлили пайдарпай истифода мешаванд, вақте ки як чиз аввал ва баъд чизи дигар меояд. Масалан, дар ин мисол:
whileParser :: Parser Stmt
whileParser = whiteSpace >> statement
Аввал шумо бояд фосиларо ҳисоб кунед ва баъд изҳорот - ки он низ навъи Parser Stmt дорад.
Функторҳои алтернативӣ барои бозгашт истифода мешаванд, агар таҳлил ноком шавад. Барои намуна,
statement :: Parser Stmt
statement = parens statement <|> sequenceOfStmt
Ин маънои онро дорад, ки шумо бояд кӯшиш кунед, ки изҳоротро дар қавсҳо хонед ё кӯшиш кунед, ки якчанд изҳоротро пайдарпай хонед.
Функторҳои татбиқшаванда асосан ҳамчун миёнабурҳо барои монадҳо истифода мешаванд. Масалан, бигзор функсияи tok баъзе аломатҳоро хонад (ин функсияи воқеӣ аз LaTeXReader аст). Биёед ин комбинатсияро бубинем
const <$> tok <*> tok
Он ду нишонро дар як саф мехонад ва аввалинашро бармегардонад.
Барои ҳамаи ин синфҳо, Ҳаскелл дорои операторҳои зебои рамзӣ мебошад, ки барномасозии Readerро ба санъати ASCII монанд мекунад. Танҳо ин рамзи аҷибро қадр кунед.
Вазифаҳои мо бо LaTeXReader алоқаманд буданд. Вазифаи Василий дастгирии фармонҳои mbox ва hbox буд, ки барои навиштани бастаҳо дар LaTeX муфид аст. Элизабет барои дастгирии фармони эпиграф масъул буд, ки ба шумо имкон медиҳад эпиграфҳоро дар ҳуҷҷатҳои LaTeX эҷод кунед.
Хатрас
Системаҳои оператсионии ба UNIX монанд аксар вақт занги системаи ptraceро амалӣ мекунанд. Он дар ислоҳ ва тақлид кардани муҳити барнома муфид аст, ки ба шумо имкон медиҳад, ки зангҳои системаро пайгирӣ кунед, ки барнома мекунад. Масалан, утилитаи хеле муфиди strace ptrace-ро дар дохили худ истифода мебарад.
Hatrace китобхонаест, ки интерфейси ptrace дар Haskell мебошад. Гап дар сари он аст, ки худи ptrace хеле мураккаб аст ва истифодаи бевоситаи он, махсусан аз забонҳои функсионалӣ хеле душвор аст.
Hatrace дар оғоз ҳамчун strace кор мекунад ва далелҳои шабеҳро қабул мекунад. Он аз strace бо он фарқ мекунад, ки он инчунин китобхонаест, ки интерфейси соддатарро аз ptrace таъмин мекунад.
Бо ёрии hatrace, мо аллакай як хатои ногуворро дар компилятори GHC Haskell дарёфтем - дар лаҳзаи нодуруст кушта шуда, он файлҳои объекти нодурустро тавлид мекунад ва ҳангоми аз нав оғоз кардан онҳоро дубора тартиб намедиҳад. Скриптҳо аз рӯи зангҳои системавӣ имкон дод, ки хатогиро дар як давидан боэътимод дубора тавлид кунад, дар ҳоле ки куштори тасодуфӣ хатогиро дар тӯли ду соат такрор мекунад.
Мо интерфейсҳои зангҳои системаро ба китобхона илова кардем - Елизавета brk илова кард ва Василий mmap илова кард. Дар асоси натичахои кори мо хангоми истифодабарии китобхона аргументхои ин зангхои системавиро соддатар ва сахехтар истифода бурдан мумкин аст.
Манбаъ: will.com