Muutujate jaoks on kontekstis kujutus zVar, mis seab muutuja nimele
vastavusse selle t¨u¨ubi, ning keskkonnas kujutus eVar, mis seab muutuja ni-
mele vastavusse selle v¨a¨artuse.
T¨u¨ubikonstruktorite jaoks on kontekstis kujutus zCon, mis seab konst-
ruktori nimele vastavusse selle t¨u¨ubi avaldisena kasutamisel (v¨ali zConExpr
kujutuse tulemuseks olevas kirjes), selle semantika n¨aidisena kasutamisel (v¨ali
zConPatt) ning selle aarsuse (zConArity). Konstruktori kasutamisel avaldi-
sena l¨aheb ainult esimest komponenti vaja, ¨ulej¨a¨anud on vajalikud konstruk-
torn¨aidise semantika jaoks. Keskkonnas on kujutus eCon, mis seab konstruk-
tori nimele vastavusse selle v¨a¨artuse avaldisena kasutamisel (eConExpr) ning
selle semantika n¨aidisena kasutamisel (eConPatt).
exists-avaldise exists C : k . t[C] andmetaseme semantikaks on nn
pakkimisfunktsioon:
Exists _pi _astr _ke _ua ->
VForall $ \ vpi -> VFun $ \ va -> VExists vpi va
See on pol¨umorfne funktsioon, mis v˜otab argumendiks monomorfset t¨u¨upi
t[C] v¨a¨artuse va ning pakib selle koos t¨u¨ubiparameetrile C vastava t¨u¨ubiklassi
c eksemplariga (v˜oi ¨uhikt¨u¨ubi v¨a¨artusega parameetrilise pol¨umorfismi korral)
vpi eksistentsiaalseks v¨a¨artuseks VExists vpi va.
forall-avaldise t¨u¨ubitaseme semantikas
Forall pi astr ke ea -> do
let KIType cid kie = ki
zpi <- polymorphismInfoZem pi ctx
let k = kindExprKem ke
let (aid, ctx’) = addTypeVar astr k ctx
ctx2 <- addInstance zpi aid cid $ ctx’
(te,ssie) <- exprZem ea kie ctx2
return (makeTForall zpi aid k te, SSIForall cid ssie)
luuakse funktsiooniga addTypeVar uus t¨u¨ubikonstruktor, millele eraldatak-
se uus unikaalne identifikaator aid, mida veel kontekstis kasutusel ei ole.
Funktsiooniga addInstance muudetakse see uus t¨u¨up (konstruktor) t¨u¨ubi-
klassi esindajaks (kui kvantifitseeritud muutuja oli seotud t¨u¨ubiklassiga). Ek-
semplari v¨a¨artus lisatakse keskkonda andmetaseme semantikas funktsiooniga
addVInstance. L¨ahemalt vaatleme seda jaotises 7.6.4.
Funktsiooni rakendamise semantikat vaatleme l¨ahemalt jaotises 7.5. type-
avaldise semantikat vaatleme jaotises 7.6.2.
64
7.4.2
T¨
u¨
ubiavaldised
Enamiku t¨u¨ubiavaldisekonstruktsioonide semantika on samuti ¨usna lihtne,
v.a t¨u¨ubitaseme programmeerimisega seotud konstruktsioonid, mille seman-
tikat vaatleme jaotises 7.6. T¨u¨ubiavaldise semantika m¨a¨arab selle t¨u¨ubitase-
me objekti, mida see avaldis kujutab.
T¨u¨ubimuutujate (s¨unon¨u¨umide) ja t¨u¨ubikonstruktorite liigitaseme seman-
tika jaoks on kontekstis kujutus zTVarKind, mis seab t¨u¨ubimuutuja v˜oi -konst-
ruktori nimele vastavusse selle liigi. See on ka ainus osa kontekstist, mida
liigitaseme semantika andmisel kasutatakse.
T¨u¨ubimuutujate t¨u¨ubitaseme semantika jaoks on kontekstis kujutus zTVar,
mis seab muutuja nimele vastavusse t¨u¨ubitaseme objekti (t¨u¨ubi, t¨u¨ubikonst-
ruktori, t¨u¨ubitaseme funktsiooni v˜oi t¨u¨ubitaseme v¨a¨artuse).
T¨u¨ubikonstruktorite t¨u¨ubitaseme semantika jaoks on kontekstis kujutus
zTCon, mis seab konstruktori nimele vastavusse t¨u¨ubitaseme objekti (antud
juhul t¨u¨ubikonstruktori).
7.4.3
N¨
aidised
N¨aidise semantika m¨a¨arab, kuidas v¨a¨artuses sisalduvat infot antud n¨aidise
poolt keskkonda (ja selle staatilist infot keskkonda) salvestatakse, s.t n¨aidise
semantika seab v¨a¨artusele ja selle t¨u¨ubile vastavusse vastavalt keskkonna- ja
kontekstiteisenduse. D¨unaamilist semantikat m¨a¨arava funktsiooni t¨u¨up on
pattSem :: Patt -> Value -> StatSemInfo -> Environment
-> Maybe Environment
Siin kasutatakse Maybe-t¨u¨upi, kuna n¨aidisesobitamine v˜oib (m˜ones keskkon-
nas) eba˜onnestuda ning sellisel juhul on tulemuseks Nothing.
Muutujan¨aidise korral lihtsalt seotakse v¨a¨artus vastava muutujanimega.
Konstruktorn¨aidise korral kontrollitakse, et v¨a¨artus oleks moodustatud ˜oi-
ge konstruktoriga ning rakendatakse konstruktori argumentv¨a¨artustele alam-
n¨aidiste semantikat, mille ¨uhendamiseks kasutatakse Maybe-monaadis foldM-
funktsiooni, seega kui m˜one alamn¨aidise sobitamine eba˜onnestus, siis on kogu
tulemuseks Nothing.
exists-n¨aidise korral tuuakse sisse uus t¨u¨ubikonstruktor, mis vajadusel
muudetakse t¨u¨ubiklassi esindajaks (kasutades eksistentsiaalse v¨a¨artuse sisse
pakitud eksemplari), sarnaselt forall-avaldise semantikaga. Eksistentsiaalse
v¨a¨artuse sees olevale tavalisele v¨a¨artusele rakendatakse alamn¨aidist.
¨
Ulej¨a¨anud andmetaseme n¨aidisekonstruktsioonid on lihtsa semantikaga.
Analoogiliselt andmetaseme n¨aidistega m¨a¨arab t¨u¨ubin¨aidise semantika,
kuidas t¨u¨ubitaseme objektis sisalduvat infot konteksti salvestada. Eraldi t¨u¨u-
65
bin¨aidisekonstruktsioonid on olemas ainult t¨u¨ubikonstruktorite, funktsiooni-
t¨u¨upide ja t¨aisarvut¨u¨ubi jaoks, tipmiste kvantoritega t¨u¨ubid sobituvad ainult
muutujan¨aidise ja ignoreerimisn¨aidisega. T¨u¨ubitaseme funktsioone ja v¨a¨ar-
tusi ei saa ¨uldse t¨u¨ubin¨aidistega kasutada. T¨u¨ubin¨aidiseid saab kasutada ai-
nult t¨u¨ubitaseme case-konstruktsioonis, mitte t¨u¨ubitaseme λ-abstraktsioonis
ega let-avaldises.
7.4.4
Algebralised andmet¨
u¨
ubid
Algebraliste andmet¨u¨upide semantika antakse kahes osas. Funktsioonidega
dataConKem, dataConZem, dataConSem antakse andmekonstruktorite (algeb-
ralise andmet¨u¨ubi variantide) semantika. Funktsioonidega dataTypeKem,
dataTypeZem, dataTypeSem antakse t¨u¨ubikonstruktori semantika.
Algebralise andmet¨u¨ubi t¨u¨ubikonstruktori staatiline semantika lisab sel-
le uue t¨u¨ubikonstruktori konteksti. Lisaks defineeritakse kolm funktsiooni:
constr, mis on selle konstruktori semantika t¨u¨ubiavaldises kasutamisel; destr,
mis kontrollib, et t¨u¨up oleks konstrueeritud just vaadeldava konstruktoriga
ja tagastab selle konstruktori argumendid; addVarsToContext, mis lisab al-
gebralise andmet¨u¨ubi definitsioonis m¨a¨aratud t¨u¨ubikonstruktori parameetrid
uute konstruktoritena konteksti.
Neid kolme funktsiooni kasutatakse selle algebralise andmet¨u¨ubi and-
mekonstruktorite staatilise semantika defineerimisel. Iga andmekonstrukto-
ri semantikas lisatakse addVarsToContext abil t¨u¨ubiparameetrid konteksti
ning leitakse andmekonstruktori argumendiks antud t¨u¨ubiavaldisele vasta-
vad t¨u¨ubid antud kontekstis. Need v˜oivad sisaldada t¨u¨ubiparameetreid. Et
leida konstruktori t¨u¨upi avaldises kasutamisel (constrType), moodustatak-
se nende argumendit¨u¨upide ja oodatava tulemust¨u¨ubi p˜ohjal curried-kujul
funktsioonit¨u¨up ning seotakse (k˜oik algebralise andmet¨u¨ubi deklaratsioonis
esinenud) ¨uldisuskvantoritega. Samuti leitakse konstruktori n¨aidisena kasu-
tamise semantika (destr) ja aarsus (arity).
Andmekonstruktori d¨unaamilises semantikas m¨a¨aratakse analoogilise aval-
disena ja n¨aidisena kasutamise semantikad (vastavalt sv ja sp).
7.4.5
Deklaratsioonid
Deklaratsiooni semantikaks on konteksti- ja keskkonnateisendus.
Mitterekursiivse let-deklaratsiooni semantika moodustatakse standard-
selt n¨aidise ja avaldise semantika p˜ohjal, lisades avaldise poolt m¨a¨aratud
v¨a¨artuse (v˜oi selle osad) n¨aidise abil keskkonda ning selle v¨a¨artuse t¨u¨ubi
kohta k¨aiva info (eksistentsiaalsete n¨aidiste korral) konteksti.
66
Dostları ilə paylaş: |