Kirjoittajat : David Binder, Tübingenin yliopisto, Saksa (2) Marco Tzschentke, Tübingenin yliopisto, Saksa Marius Muller, Tübingenin yliopisto, Saksa (4) Klaus Ostermann, Tübingenin yliopisto, Saksa Authors: David Binder, Tübingenin yliopisto, Saksa (2) Marco Tzschentke, Tübingenin yliopisto, Saksa Marius Muller, Tübingenin yliopisto, Saksa (4) Klaus Ostermann, Tübingenin yliopisto, Saksa Pöytä vasemmalla Introduction Translating To Sequent Calculus 2.1 Arithmetic Expressions 2.2 Let Bindings 2.3 Top-level Definitions 2.4 Algebraic Data and Codata Types 2.5 First-Class Functions 2.6 Control Operators Evaluation Within a Context 3.1 Evaluation Contexts for Fun 3.2 Focusing on Evaluation in Core Typing Rules 4.1 Typing Rules for Fun 4.2 Typing Rules for Core 4.3 Type Soundness Insights 5.1 Evaluation Contexts are First Class 5.2 Data is Dual to Codata 5.3 Let-Bindings are Dual to Control Operators 5.4 The Case-of-Case Transformation 5.5 Direct and Indirect Consumers 5.6 Call-By-Value, Call-By-Name and Eta-Laws 5.7 Linear Logic and the Duality of Exceptions Related Work Conclusion, Data Availability Statement, and Acknowledgments Johdatus Tyypilliset säännöt Liittyvät työt Päätelmä, tietojen saatavuuslauseke ja tunnustukset A. Suhde peräkkäiseen laskelmaan B. Kirjoittaminen sääntöjä hauskaa C. Etiketin / goto:n operatiivinen semantiikka Viittaukset 1 Johdanto Oletetaan, että olet juuri ottanut käyttöön oman pienen toiminnallisen kielen. Voit testata sitä kirjoittamalla seuraavan toiminnon, joka kerää kaikki luettelossa olevat numerot: Tyypillistä on se, että kymppiä (kymppiä) on enemmän kuin kymppiä. Mitä vikoja tästä toteutuksesta on, että tiedät ilmeinen optimointi: Funktion pitäisi suoraan palauttaa nolla, jos se kohtaa nollan luettelossa. On monia tapoja saavuttaa tämä, mutta voit valita laajentaa kieltäsi merkittyjä ilmaisuja ja goto-ohje. def mult(l) label α { mult’(l; α) } Kysymyksessä on se, että mikäli keksitään, niin keksitään, mikäli keksitään. Tässä on, miten luet tätä kappaletta: Listan argumentin l:n lisäksi määritelmä def mult(l; α) . . . ottaa argumentin α, joka osoittaa, miten laskenta pitäisi jatkaa, kun kertoimen tulos on laskettu (käytämme jälleen ; näiden kahden tyyppisten argumenttien erottamiseksi). Apufunktio mult’ ottaa luettelon argumentin l ja kaksi argumenttia α ja β; argumentti β osoittaa, missä funktio tulisi palata normaaliin toistokutsuun, kun taas α osoittaa lyhytkierron laskentapisteen paluupisteen. Multin ruumiissa käytämme l l tapausta {Nil ⇒ . . . . , Cons(x, xs) ⇒ . . . .} varmasti suorittaa tapauksen jakautumisen listalla l. Jos lu Curien ja Herbelin [2000] esittelivät ensimmäisen kerran näkemänne λμμ ̃-calculuksen ratkaisuina pitkään avoimeen kysymykseen: Minkälaisena pitäisi olla peräkkäisen laskelman termikieli? Peräkkäinen laskelma on yksi kahdesta vaikutusvaltaisesta todistelaskelmasta, jotka Gentzen [1935a,b] esitteli yhdessä paperissa, toinen laskelma on luonnollinen laskelma. Luonnollisen laskelman termikieli on tavallinen lambda-laskelma, mutta oli vaikea löytää hyvää peräkkäisen laskelman termikieltä. Sen jälkeen kun se oli löydetty, λμμ ̃-laskelma ehdotettiin paremmaksi perustaksi kompilointikielille, esimerkiksi Downen et al. [2016]. Tästä huolimatta useimmat suunnittelun Usein keskustelemme oppilaiden ja kollegoiden kanssa ajatuksista, jotka liittyvät λμμ ̃-laskelmaan, ja siksi meidän on esitettävä ne sen keskeisiin ideoihin. Mutta emme yleensä voi motivoida λμμ ̃-laskelmaa johdonmukaisen laskelman määritysjärjestelmänä, koska useimmat heistä eivät tunne sitä. Sen sijaan selitämme valkoisella taululla olevaa λμμ ̃-laskelmaa kokoamalla siihen pieniä toiminnallisia ohjelmia. Tällainen johdanto puuttuu valitettavasti edelleen julkaistusta kirjallisuudesta; useimmat nykyiset esitykset joko edellyttävät tietämystä johdonmukaisesta laskelmasta tai muuten käyttävät paljon tilaa sen esittämiseen ensin. Uskomme, että jos voidaan ymmärtää lambdaus-laskelmaa oppimatta ensin luonnollisia väitteitä, Miksi olemme innostuneita λμμ ̃-laskelmasta, ja miksi ajattelemme, että enemmän ihmisiä pitäisi tutustua sen keskeisiin ideoihin ja käsitteisiin? Pääpiirre, joka erottaa λμμ ̃-laskelman lambda-laskelmasta, on sen ensiluokkainen käsittely arviointikonteksteistä. Arviointikonteksti on ohjelman jäljellä oleva osa, joka kulkee nykyisen alailmaisun jälkeen. Tämä tulee selkeämmäksi esimerkillä: Kun haluamme arvioida ilmaisua (2 + 3) ∗ 5, meidän on ensin keskityttävä alailmaukseen 2 + 3 ja arvioitava se sen tulokseen 5. Ohjelman loput, joka suoritetaan arvioinnin jälkeen, voidaan edustaa arviointikonteksilla □ ∗ 5. Emme voi sitoa arviointikontekstia, kuten □ ∗ 5, muuttujaan lambda-tyypin laskelmassa, mutta λμμ ̃-laskelmassa voimme sitoa tällaiset arviointikonteksit kovariabeleihin. Lisäksi μ-operaattori antaa suoran pääsyn arviointikontekstiin, jossa ilmaisua arvioidaan tällä hetkellä. Tällainen suora pääsy arviointikontekstiin ei aina ole välttämätöntä ohjelmoijalle, joka haluaa kirjoittaa sovelluksen, mutta usein on tärke Loput paperista on jäsennelty seuraavasti: • Osassa 2 esittelemme pintakielen Fun ja näytämme, miten voimme kääntää sen sekvenssikalkulus-pohjaiseen kielen ytimeen. pintakieli on enimmäkseen ilmaisusuuntautunut toiminnallinen ohjelmointikieli, mutta olemme lisänneet joitakin ominaisuuksia, kuten codata-tyyppejä ja ohjausoperaattoreita, joiden käännökset antavat tärkeää tietoa siitä, miten λμμ ̃-calculus toimii. • Osassa 3 käsittelemme staattista ja dynaamista tarkennusta, jotka ovat kaksi läheisesti liittyvää tekniikkaa, joilla nostetaan alailmaisut, jotka eivät ole arvoja asentoon, jossa niitä voidaan arvioida. • Osa 4 esittelee Fun- ja Core-tyyppisäännöt ja osoittaa standarditulokset kirjoittamisesta ja arvioinnista. Näytämme, miksi olemme innoissamme λμμ ̃-laskelmasta 5. Esittelemme erilaisia ohjelmointikielen käsitteitä, jotka tulevat paljon selkeämmiksi, kun esittelemme ne λμμ ̃-laskelmassa: Näytämme, että let-bindings ovat täsmälleen kaksinkertaisia ohjaamaan operaattoreita, että data ja codata-tyypit ovat kaksi täysin kaksinkertaista tapaa määrittää tyyppejä, ja että tapauskohtainen muutos ei ole mitään muuta kuin μ-vähennys. • Lopuksi käsittelemme kohdassa 6 siihen liittyvää työtä ja annamme ohjeita jatkokäsittelyyn. Tähän paperiin liittyy Haskell-sovellus, joka on saatavilla myös vuorovaikutteisena verkkosivustona (ks. kuva 1). Tämä artikkeli on saatavilla arkivissä CC BY 4.0 -lisenssillä. Tämä paperi on Käyttöoikeus on CC BY 4.0. Saatavilla arkistoinnissa Saatavilla arkistoinnissa [1] Kiinnostuneelle lukijalle näytämme liitteessä A, miten sekvenssimääritys ja λμμ ̃-laskelma liittyvät toisiinsa.