ZuriHac: pratîkkirina bernameya fonksiyonel

Di Hezîrana îsal de, li bajarê Rapperswil ê Swîsreyê, bûyerek bi navê ZuriHac. Vê carê zêdetirî pêncsed hezkiriyên Heskîfê, ji destpêk heta damezrînerên ziman anî cem hev. Her çend organîzator ji vê bûyerê re dibêjin hackathon, lê ew ne konferansek an jî hackathonek bi wateya klasîk e. Forma wê ji bernamenûsên kevneşopî cuda ye. Em bi bextê ZuriHac fêr bûn, beşdarî wê bûn, û naha em wekî erkê xwe dihesibînin ku em qala dîtina neasayî bikin!

ZuriHac: pratîkkirina bernameya fonksiyonel

Derbarê me

Ev gotar ji aliyê du xwendekarên pola 3. ya bernameya "Mathematics Applied and Informatics" li Zanîngeha Lêkolînê ya Neteweyî ya Dibistana Bilind a Aboriyê - St. Meraqa bernamesaziya fonksîyonel ji bo me her duyan bi rêze dersên D. N. Moskvin di sala 2yemîn a zanîngehê de dest pê kir. Vasily niha beşdarî bernameya Google Summer of Code dibe, ku tê de ew grafikên cebrîkî li Haskell di bin rêberiya tîmê projeyê de bicîh dike. Alga. Elizaveta di xebata qursê de ku ji bo pêkanîna algorîtmaya dijî-yekbûnê bi serîlêdana paşîn di teoriya celebê de hatî veqetandin, jêhatîbûnên bernamesaziya fonksiyonel ên bidestxistî bi kar anî.

Forma bûyerê

Temaşevan xwedan projeyên çavkaniya vekirî, bernameçêkerên ku dixwazin beşdarî pêşkeftina wan bibin, lêkolînerên bernamesaziya fonksiyonel, û mirovên ku bi tenê ji Haskell dilşewat in. Îsal, pêşdebirên ji pêncî zêdetir projeyên Haskell-ê yên çavkaniya vekirî ji çar aliyên cîhanê li cîhê kom bûn - HSR Hochschule für Technik Rapperswil - da ku li ser hilberên xwe biaxivin û mirovên nû bi pêşkeftina wan re eleqedar bikin.

ZuriHac: pratîkkirina bernameya fonksiyonel

Wêne ji Twitter ZuriHac

Bername pir hêsan e: hûn hewce ne ku di pêş de li ser projeya xwe çend pêşniyaran binivîsin û wan ji organîzatoran re bişînin, yên ku dê li ser rûpela bûyerê agahdariya projeya we bişînin. Wekî din, di roja yekem de, nivîskarên projeyan sî saniye hene ku pir kurt ji qonaxê vebêjin ka ew çi dikin û çi hewce dike ku were kirin. Dûv re kesên eleqedar li nivîskaran digerin û li ser karan bi hûrgulî dipirsin.

Hîn projeyên me yên vekirî nînin, lê em bi rastî dixwazin beşdarî yên heyî bibin, ji ber vê yekê me wekî beşdarên birêkûpêk tomar kir. Di nav sê rojan de, me bi du komên pêşdebiran re xebitî. Derket holê ku lêkolîna hevbeş a kod û pêwendiya zindî danûstendina di navbera nivîskarên projeyê û beşdaran de pir hilberdar dike - li ZuriHac me karîbû deverên ku ji me re nû bûn fam bikin û karîbûn alîkariya du tîmên bi tevahî cûda bikin, di her yekê de yek peywirek temam bikin. yên projeyan.

Li ZuriHacê ji bilî pratîka hêja, gelek ders û dersên masterê jî hatin dayîn. Em bi taybetî du dersan bi bîr tînin. Di yekem ji wan de, Andrey Mokhov ji Zanîngeha Newcastle li ser fonksiyonên sepandî yên hilbijartî peyivî - çînek celebên ku divê di navbera fonksiyonên sepandî û monadan de bibin navber. Di gotarek din de, yek ji damezrînerên Haskell, Simon Peyton Jones, li ser çawa di berhevkarê GHC de encamnameya celebê dixebite axivî.

ZuriHac: pratîkkirina bernameya fonksiyonel

Ders ji hêla Simon Peyton Jones ve. Wêne ji Twitter ZuriHac

Dersên masterê yên di dema hackathonê de li gorî asta perwerdehiya beşdaran li sê kategoriyan hatin dabeş kirin. Karên ku ji bo beşdarên ku beşdarî pêşxistina projeyan bûne hatin pêşkêş kirin jî bi asta dijwariyê hatin nîşankirin. Civata piçûk lê heval a bernamenûsên fonksiyonel bi kêfxweşî pêşwaziya kesên nûhatî dike di nav rêzên xwe de. Ji bo fêmkirina dersên Andrei Mokhov û Simon Peyton Jones, lêbelê, qursa bernameya fonksiyonel a ku me li zanîngehê girt pir bikêr bû.

Qeydkirina bûyerê hem ji bo beşdarên birêkûpêk û hem jî ji bo nivîskarên projeyê belaş e. Me di destpêka hezîranê de serîlêdanên ji bo beşdarbûnê pêşkêş kir, piştî ku em bi lez ji navnîşa bendê veguhestin navnîşa beşdarên pejirandî.

Û niha em ê li ser projeyên ku di pêşveçûna wan de beşdar bûne biaxivin.

pandoc

pandoc Veguhezkarek gerdûnî ya belgeyên nivîsê ye, bi rastî, ji her formatê berbi her yekê. Mînakî, ji docx berbi pdf, an ji Markdown berbi MediaWiki. Nivîskarê wê, John MacFarlane, profesorê felsefeyê ye li zanîngeha California, Berkeley. Bi gelemperî, Pandoc pir navdar e, û hin hevalên me dema ku fêr bûn ku Pandoc li Heskîfê hatiye nivîsandin, şaş man.

ZuriHac: pratîkkirina bernameya fonksiyonel

Lîsteya formatên belgeyên ku ji hêla Pandoc ve têne piştgirî kirin. Li ser malperê grafiyek tevahî jî heye, lê ev wêne di gotarê de cih nagire.

Bê guman, Pandoc ji bo her cotek formatan veguherînek rasterast peyda nake. Ji bo piştgirîkirina cûrbecûr veguherînan, çareseriyek mîmarî ya standard tê bikar anîn: Pêşîn, tevahiya belgeyê di nûnertiyek navîn a navxweyî ya taybetî de tê wergerandin, û dûv re jî belgeyek bi rengek cûda ji vê nûnertiya hundurîn tê hilberandin. Pêşdebir gazî nûnertiya navxweyî dikin "AST", ku tê wateya Dara Hevoksaziya Abstract, an dara hevoksaziya razber. Hûn dikarin pir bi hêsanî li nûnertiya navîn binihêrin: ya ku hûn hewce ne bikin ev e ku formata derketinê li "xwecihî" saz bikin.

$ cat example.html
<h1>Hello, World!</h1>

$ pandoc -f html -t native example.html
[Header 1 ("hello-world",[],[]) [Str "Hello,",Space,Str "World!"]]

Xwendevanên ku bi kêmanî piçekî bi Haskell re xebitîne dikarin ji vê mînaka piçûk texmîn bikin ku Pandoc bi Haskell hatî nivîsandin: Derketina vê fermanê temsîla rêzê ya strukturên hundurîn ên Pandoc e, ku bi awayê ku bi gelemperî tête çêkirin. li Haskell wek nimûne, di pirtûkxaneya standard.

Ji ber vê yekê, li vir hûn dikarin bibînin ku nûneriya hundurîn avahiyek vegerî ye, ku di her girêka hundurîn de navnîşek wê heye. Mînakî, di asta jorîn de navnîşek yek elementek heye - sernavê asta yekem bi taybetmendiyên "silav-cîhan",[],[]. Di hundurê vê sernivîsê de navnîşek rêzika "Silav" heye, li dû wê valahiyek û rêzika "Cîhan!".

Wekî ku hûn dikarin bibînin, nûneriya navxweyî ji HTML-ê ne pir cûda ye. Ew darek e ku her girêkek hundurîn hin agahdarî li ser şiklê neviyên xwe peyda dike, û pel jî naveroka rastîn a belgeyê vedihewîne.

Ger em dakevin asta pêkanînê, celebê daneyê ji bo tevahiya belgeyê bi vî rengî tête diyar kirin:

data Pandoc = Pandoc Meta [Block]

Li vir Block bi rastî ristên hundurîn ên ku li jor hatine behs kirin e, û Meta metaformasyon e li ser belgeyê, wek sernav, dîroka afirandinê, nivîskaran - ev ji bo formên cihêreng cûda ye, û Pandoc, heke gengaz be, hewl dide ku agahdariya weha biparêze dema ku ji formatê wergerîne. çap.

Hema hema hemî çêkerên celebê Block - bo nimûne, Sernivîs an Para (paragraf) - taybetmendî û navnîşek lûtkeyên asta jêrîn wekî arguman digirin - Inline, wekî qaîdeyek. Mînakî, Space an Str çêkerên celebê Inline ne, û etîketa HTML jî vediguhere Inline-ya xweya taybetî. Em ti xalê nabînin ku pênaseyek bêkêmasî ya van celeban peyda bikin, lê bala xwe bidin ku ew li vir dikare were dîtin vir.

Balkêş e, celebê Pandoc monoîd e. Ev tê wê wateyê ku celebek belgeyek vala heye, û ew belge dikarin li hev werin berhev kirin. Di dema nivîsandina Xwendevanan de karanîna vê hêsan e - hûn dikarin bi karanîna mantiqê kêfî belgeyek parçe parçe bikin, her yekê ji hev veqetînin, û dûv re her tiştî li yek belgeyê bixin nav hev. Di vê rewşê de, metaformasyon dê ji hemî beşên belgeyê yekcar were berhev kirin.

Dema ku, bêje, ji LaTeX bo HTML veguherîne, pêşî modulek taybetî ya bi navê LaTeXReader belgeya têketinê vediguherîne AST, paşê modulek din a bi navê HTMLWriter AST-ê vediguherîne HTML. Bi saya vê mîmariyê, ne hewce ye ku hejmareke çargoşe ya veguherînan binivîsin - ji bo her formatek nû nivîsandina Reader û Writer bes e, û hemî cotên veguheztina gengaz bixweber têne piştgirî kirin.

Eşkere ye ku mîmariyek weha kêmasiyên xwe jî hene, ku ji mêj ve ji hêla pisporên di warê mîmariya nermalavê de hatine pêşbînî kirin. Ya herî girîng lêçûna guhertinên li dara hevoksaziyê ye. Ger guhertin têra xwe ciddî be, hûn ê neçar bin ku kodê di hemî Xwendevan û Nivîskaran de biguhezînin. Mînakî, yek ji wan kêşeyên ku pêşdebirên Pandoc re rû bi rû dimînin piştgirîkirina formatên tabloya tevlihev e. Naha Pandoc tenê dikare tabloyên pir hêsan, bi serek, stûn û nirxek di her hucreyê de biafirîne. Mînakî, taybetmendiya colspan di HTML-ê de dê bi hêsanî were paşguh kirin. Yek ji sedemên vê tevgerê nebûna nexşeyek yekgirtî ye ji bo temsîlkirina tabloyan di hemî an bi kêmî ve gelek formatan de - li gorî vê yekê, ne diyar e ka tablo bi çi rengî divê di nûnertiya hundurîn de were hilanîn. Lê tewra piştî ku nêrînek taybetî hilbijêrin, hûn ê hewce ne ku bi tevahî hemî Xwendevan û Nivîskarên ku piştgirî didin xebata bi tabloyan biguhezînin.

Zimanê Haskell ne tenê ji ber hezkirina mezin a nivîskaran ji bernameya fonksiyonel re hate hilbijartin. Haskell bi kapasîteyên xwe yên hilberandina nivîsê ya berfireh tê zanîn. Mînakek pirtûkxane ye parsek pirtûkxaneyek e ku bi aktîvî têgehên bernamesaziya fonksiyonel - monoîd, monad, fonksiyonên sepandî û alternatîf - bikar tîne da ku parserên keyfî binivîse. Hêza tevahî ya Parsec tê de tê dîtin mînak ji HaskellWiki, ku parserek bêkêmasî ya zimanek bernamesaziya fermanî ya hêsan tê pars kirin. Bê guman, Parsec di Pandoc de jî çalak tê bikar anîn.

Bi kurtasî hate rave kirin, monad ji bo parskirina rêzdar têne bikar anîn, gava ku tiştek yekem tê, û dûv re tiştek din tê. Ji bo nimûne, di vê nimûneyê de:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

Pêşî hûn hewce ne ku cîhê bijmêrin, û dûv re jî danezanê - ku celebê Parser Stmt jî heye.

Heke parsing têk neçe, fonksiyonên alternatîf têne bikar anîn da ku paşde vegerin. Bo nimûne,

statement :: Parser Stmt
statement = parens statement <|> sequenceOfStmt

Wateya ku hûn an hewce ne ku hûn hewl bidin ku gotinê di nav kevanan de bixwînin, an jî hewl bidin ku çend gotinan li pey hev bixwînin.

Fonksiyonên sepandî di serî de wekî kurtebirên monadan têne bikar anîn. Mînakî, bila fonksiyona tok hin nîşanek bixwîne (ev fonksiyonek rastîn a LaTeXReader e). Ka em li vê tevliheviyê binêrin

const <$> tok <*> tok

Ew ê du nîşanan li pey hev bixwîne û ya yekem vegerîne.

Ji bo van hemî dersan, Haskell xwediyê operatorên sembolîk ên xweşik e, ku bernameya Reader wekî hunera ASCII xuya dike. Tenê heyranê vê koda ecêb bin.

Karên me bi LaTeXReader ve girêdayî bûn. Karê Vasily piştgirîkirina fermanên mbox û hbox bû, ku ji bo nivîsandina pakêtan di LaTeX de kêrhatî ye. Elizabeth berpirsiyariya piştgirîkirina fermana epigraphê bû, ku dihêle hûn di belgeyên LaTeX de epigrafan biafirînin.

Hatrace

Pergalên xebitandinê yên mîna UNIX-ê bi gelemperî banga pergala ptrace pêk tînin. Ew di debugkirin û simulasyona hawîrdorên bernameyê de bikêr e, ku dihêle hûn bangên pergalê yên ku bername dike bişopînin. Mînakî, kargêriya strace ya pir bikêr ptrace di hundurê xwe de bikar tîne.

Hatrace pirtûkxaneyek e ku ji bo ptraceyê li Haskell navberek peyda dike. Rastî ev e ku ptrace bixwe pir sofîstîke ye û karanîna wê rasterast, nemaze ji zimanên fonksiyonel, pir dijwar e.

Hatrace dema ku dest pê dike wek strace dimeşe û argumanên bi vî rengî qebûl dike. Ew ji straceyê cûda dibe ku ew di heman demê de pirtûkxaneyek e ku ji tenê ptrace pêwendiyek hêsan peyda dike.

Bi alîkariya hatrace, me berê di berhevkarê GHC Haskell de xeletiyek ne xweş girtiye - di demek xelet de tê kuştin, ew pelên tiştên nerast çêdike û dema ku ji nû ve dest pê dike wan ji nû ve berhev nake. Skrîpta ji hêla bangên pergalê ve gengaz kir ku meriv bi pêbawerî xeletiyê di yek gavê de ji nû ve hilberîne, dema ku kuştinên rasthatî xeletî di nav du demjimêran de dubare kir.

Me navgînên banga pergalê li pirtûkxaneyê zêde kir - Elizaveta brk lê zêde kir, û Vasily mmap lê zêde kir. Li ser bingeha encamên xebata me, dema karanîna pirtûkxaneyê gengaz e ku meriv argumanên van bangên pergalê bi sadetir û rasttir bikar bîne.

Source: www.habr.com

Add a comment