A Concurrent Clean 2.3 programozási nyelv

Absztrakt adattípusok

Előre definiált absztrakt típusok

Az absztrakt adattípusok olyan típusok, amelyeknek az aktuális definíciója rejtett. A Clean-ben előre definiált absztrakt adattípusok a World és a File. Ezeket felismeri a fordítóprogram és speciálisan kezeli, egyrészt hatékonysági okokból, másrészt azért, mert speciális szerepük van a nyelvben. Mivel az aktuális definíció rejtett, ezért nincs lehetőség ilyen típusú konstans értékek létrehozására.

A *World típusú objektum automatikusan létrejön programok indításánál, illetve opcionálisan átadatjuk a Start függvénynek, mint argumentumot. Ennek az objektumnak a segítségével hatékony interakció valósítható meg a "külvilággal" (ami persze feltétlenül egyedi).

Interaktív program startkifejezése:

Start:: *World -> *World Start w = ...

A "..." a megváltoztatott világ leírásának helye, az input-output könyvtár objektumai és függvényei használhatók itt. Ezek a könyvtárak kiterjedt lehetőségekkel rendelkeznek, de éppen ezért ez egy külön nagy téma, amit most nem tárgyalunk.

A File vagy *File típus egy objektuma a StdFileIO könyvtárban definiált függvények segítségével hozható létre. Perzisztens adat közvetlen manipulációját teszi lehetővé.

A String típus egy előredefiniált szinonimatípus (kényelmi meggondolásokból). Ez a típus a karakterek dobozolatlan tömbjének ({#Char}) szinonimája.

Absztrakt adattípusok definiálása

Absztrakt adattípust úgy definiálhatunk, hogy a típus definíciójának csak a bal oldalát adjuk meg a definíciós modulban, a jobb oldalt csak az implementációs modulban írjuk le.

A konkrét típus bal oldalának meg kell egyeznie az absztrakt adattípus definíciójának bal oldalával (kivéve a szigorúsági és egyediségi attribútumokat).

definition module abstract // abstract type ::Complex createComplex :: Real Real -> Complex re :: Complex -> Real im :: Complex -> Real (+^) infixl 6 :: Complex Complex -> Complex ~^ :: Complex -> Complex

implementation module abstract // abstract type import StdEnv ::Complex = { re:: Real, im:: Real} createComplex:: Real Real -> Complex createComplex r i = {re = r, im = i} re:: Complex -> Real re {re} = re im:: Complex -> Real im {im} = im (+^) infixl 6:: Complex Complex -> Complex (+^) {re = r1, im = i1} {re = r2, im = i2} = {re = r1 + r2, im = i1 + i2} ~^ :: Complex -> Complex ~^ x=:{im} = {x & im = ~im}