Apple

Generic, típussal való paraméterezés

Az Apple-ban 3 fajta modul van: függvények, osztályok, környezetek. Az első kettő az absztrakció példája.

Az Apple-ban az osztálydefiníció megengedi a típusabsztrakciót, azaz egy osztálynak lehetnek típus paraméterei. Egy osztály definíció az Apple-ben a következő részeket tartalmazza:

A reprezentációs rész szintén tartalmazhatja más konstansok és típusok deklarációit.

Példa

Legyen Failure egy felsorolási típus egytelen elemmel type Failure:{failure}

Ekkor a Stack típus a következő osztálydeklarációval adható meg.

class Stack of type T//T is a parameter of the class ==def Newstack:carrier Push : carrier*T->carrier, Pop : carrier->carrier, Top : carrier->NonEmpty#T+EmptyStack#Failure rep type carrier : record Store : integer->NonEmpty#t+EmptyStack#Failure Index : integer end const Newstack==[Store==function(i) return Emptystack#failure end, Index==-1] Push==function(S,x) return let P:integer==succ S.Index in [Index==P, Store==S.Store|p:Nonempty#x] endlet end, Pop==function(s) return let P:integer==succ S.Index in if P>=0 then [Store==S.Store, Index==pred P] else S endif endlet end Top==function(s) return S.Store(S.Index)

Mivel a Top alkalmazása egy Stack típusú argumentumra egy unio típusú értéket állít elő, ezt meg kell vizsgálni egy unioncase kifejezéssel, vagy utasítással, a komponensektípusának felismerésére. Például, ha NumStack a Stack osztály egy példányaként lett deklarálva:

type NumStack : Stack [type float]

akkor a stack elemeinke összegét kiszámító függvényt a következő módon lehet definiálni:

const stacknum : NumStack->float ==function(S) return unioncase NumStack$Top S of NonEmpty#x in stacksum (numStack$PopS)+x || EmptyStack# y in 0 endcase end