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:
- fejrészt, amely az osztály nevét és formális paramétereit
tartalmazza. Ezek lehetnek típusok és konstansok is.
- definíciós listát, amely megadja azon konstansok nevét és
típusának megjelölését, amleyeket az osztály exportál. Minden típushoz,
amely az osztályból származik, ezeknek az exportált konstansoknak egy
készlete beépül a környezetbe, amelyben az osztályfüggő típus
deklarálva lett.
- reprezentációs részt, amlely deklarál egy lokális
környezetet amelyben a definíciós listában megnevezett konstansok
explicit reprezentációi vannak megadva. Ennek a lokális környezetnek
tartalmaznia kell:
-
- egy carrier-nek nevezett típus deklarációt, amelyben
valamennyi osztály-függő típus reprezentálva van.
- a definíciós listában megnevezett és típusozott
konstansok deklarációját
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