Vaatleme Java n¨aidet:
class BlackBox {
private BigInteger secret;
BlackBox(BigInteger secret) {
this.secret = secret;
}
public boolean f(BigInteger x) {
if (x.equals(new BigInteger("1000666"))) {
throw new RuntimeException(secret.toString());
}
return x.compareTo(secret) < 0;
}
}
class Adversary {
public static BigInteger attack(BlackBox box) {
try {
boolean dummy = box.f(new BigInteger("1000666"));
} catch (RuntimeException e) {
return new BigInteger(e.getMessage());
}
return null;
}
}
class Test {
public static void main(String[] args) {
BlackBox box = new BlackBox(
new BigInteger("123456789123456789123456789"));
System.out.println("Adversary.attack(box) = "
+ Adversary.attack(box));
}
}
Siin defineeritakse must kast box, mis sisaldab salajast informatsiooni (se-
da hoitakse piiramatu suurusega t¨aisarvulises muutujas secret), kuid selle
salajase v¨a¨artuse kohta on v˜oimalik infot saada ainult funktsiooni f kaudu.
See funktsioon saab sisendiks piiramatu suurusega t¨aisarvu x ning tulemuse
12
t¨u¨ubi boolean j¨argi peaks tagastama v¨a¨artuse, mis sisaldab maksimaalselt
¨uhe biti infot kastis oleva salajase v¨a¨artuse kohta.
Antud n¨aites on aga funktsiooni f koodi sokutatud tagauks, mis teatud
argumendi x v¨a¨artuse korral viskab erindi, mis sisaldab kogu salajase info.
Seda tagaust kasutab meetod Adversary.attack, et mustast kastist ainult
¨uhe p¨aringuga kogu salajane info k¨atte saada. See on v˜oimalik seet˜ottu, et
Javas on v˜oimalik nn run-time erindeid visata suvalisest meetodist ilma seda
meetodi t¨u¨ubis (p¨aises) deklareerimata. Kui funktsiooni t¨u¨ubiga oleks v˜oima-
lik erindite viskamine t¨aiesti ¨ara keelata, siis oleks v˜oimalik v¨alistada sellise
tagaukse koodi sokutamine.
Seet˜ottu Fumontrixis ei kasutata implitsiitselt laiendatud (v.a ⊥-ga) t¨u¨u-
pe ning v˜oimalik k˜orvalefektide v˜oi erindite sisaldumine on t¨u¨ubist n¨aha.
2.5
Imperatiivne stiil
M˜oningaid algoritme on lihtsam kirja panna imperatiivses stiilis kui funkt-
sionaalses. Seega v˜oiks funktsionaalne keel sisaldada ka v˜oimalusi impera-
tiivse stiili kasutamiseks, n¨aiteks muudetavaid viitasid ja massiive. Haskellis
on selleks olemas IO- ja ST-monaad (IO-monaadi kohta vt [3], peat¨ukk 2).
ST-monaadi korral kontrollitakse t¨u¨ubis¨usteemi abil, et viitasid ja massiive
kasutatakse ainult selles l˜oimes, kus need on defineeritud ning alles p¨arast
nende defineerimist. ST-monaadist on v˜oimalik arvutuse tulemust ohutult
k¨atte saada, kuna arvutus toimub eraldi l˜oimes, mis on v˜oimalik l˜opuni jook-
sutada ning kuhugi mujale viiteid selle l˜oime seisundile ei j¨a¨a. IO-monaadist
v¨a¨artusi ohutult k¨atte ei saa. Seega puhtas funktsionaalses keeles oleks im-
peratiivsete arvutuste jaoks parem kasutada ST-monaadi.
Ka Fumontrixis on ST-monaad realiseeritud ning selles saab kasutada
(lugeda ja kirjutada) viitasid ja massiive. Selleks kasutatakse sisemiselt Has-
kelli IO-monaadi ja arvutuse v¨a¨artus saadakse k¨atte unsafePerformIO abil,
kuid Fumontrixi t¨u¨ubis¨usteemi abil kontrollitakse, et kasutada saaks ainult
ohutuid arvutusi, mis on jooksutatavad eraldi l˜oimes.
Jaotises 6.5 vaatleme monaadiliste v¨a¨artuste pol¨umorfismi, mis muudab
Fumontrixis imperatiivse stiili kasutamise mugavamaks.
2.6
Anon¨
u¨
umsed funktsioonid ka t¨
u¨
ubitasemel
Fumontrixis on olemas t¨u¨ubitaseme funktsioonid. Erinevalt GHC-st on Fu-
montrixis t¨u¨ubitaseme funktsioonid first-class. Neid saab luua ka ilma nime
andmata (anon¨u¨umsete funktsioonidena), isegi kui tegemist on (liht)rekur-
siivse funktsiooniga, ning neid saab anda argumendiks teistele t¨u¨ubitaseme
13
funktsioonidele. See s¨a¨astab teatud juhtudel programmeerijat nimede v¨al-
jam˜otlemise ja meeldej¨atmise vaevast ning koodi hakkimisest. Fumontrixi
t¨u¨ubitaseme funktsioone vaatleme l¨ahemalt jaotises 5.1.
14
3
S¨
untaks
3.1
V˜
ordlus Haskelliga
Fumontrixi s¨untaks on mingil m¨a¨aral sarnane Haskelli omaga, kuid seal on
m˜oned olulised erinevused.
Erinevalt Haskellist ei kasutata reavahetusi ja treppimist s¨untaksi osa-
na. Reavahetuse asemel kasutatakse (deklaratsioonide, valikualternatiivide
jne) nimekirjas eraldajana semikoolonit. Nimekirja l˜opetamiseks kasutatakse
negatiivse treppimise asemel v˜otmes˜ona end v˜oi, kui nimekiri ei asu konst-
ruktsiooni l˜opus, siis m˜onda muud v˜otmes˜ona (let-konstruktsiooni korral
n¨aiteks in). Nimekirja viimase elemendi j¨arel on semikoolon lubatud, kuid
mitte kohustuslik.
Fumontrixis kasutatakse λ-avaldises noole asemel punkti nagu lambdaar-
vutuses. See v¨ahendab vajadust sulgude j¨arele, kuna n¨aidise annotatsiooniks
olevas t¨u¨ubiavaldises v˜oidakse kasutada noolt funktsioonit¨u¨ubi t¨ahistamiseks
ja see v˜oiks segi minna λ-avaldise noolega. Punkti kasutatakse ka kvantorite
korral nagu GHC-ski.
Erinevalt Haskellist on Fumontrixis kvantoritega seotud muutujate nimed
suure algust¨ahega, kuna kvantoritega sissetoodud muutujad on Fumontrixis
sarnased algebraliste andmet¨u¨upide konstruktoritega (neid saab kasutada sa-
mades kontekstides, n¨aiteks t¨u¨ubiavaldistes v˜oi t¨u¨ubin¨aidistes). Kvantoriga
sissetoodud konstruktori abil konstrueeritavad t¨u¨ubid on erinevad k˜oigist va-
rem skoobis olnud t¨u¨upidest.
T¨u¨ubis¨unon¨u¨umide nimed on Fumontrixis v¨aikese algust¨ahega nagu and-
metaseme v¨a¨artuste s¨unon¨u¨umid (andmetaseme muutujad). Nende sissetoo-
mine ei tekita uusi t¨u¨upe v˜oi v¨a¨artusi, vaid annab lihtsalt olemasolevale t¨u¨u-
bile v˜oi v¨a¨artusele (uue) nime.
T¨u¨ubiklasside nimed on Fumontrixis v¨aikese algust¨ahega, kuna Fumon-
trixis t¨ahistab t¨u¨ubiklassi nimi selle t¨u¨ubifunktsiooni nime, mis seab igale
klassi t¨u¨ubile (esindajale) vastavusse klassi eksemplari (klassi v¨a¨artuse (mis
tavaliselt on mingi funktsioonide kogum) realisatsiooni antud t¨u¨ubi jaoks).
3.2
S¨
untaksi ¨
ulevaade
3.2.1
S¨
untaktilised kategooriad
J¨argnevates alajaotistes on erinevate s¨untaktiliste kategooriate elemente t¨a-
histavad muutujad j¨argnevate nimedega (millele v˜oivad lisanduda indeksid):
15