A Stratego típusrendszerében a központi fogalom a szort; minden term rendelkezik valamiféle szorttal. Előre definiált szort az Integer és a String. A konstruktorok szignatúrája kötött: az egyes pozíciókon elfogadható termek szortját előre meg kell adni, s egy helyen csak egyfajta szort elfogadható. A szortok között implicit konverzió adható meg név nélküli unáris konstruktorral. Ezt injekciónak is nevezik.
A program signature
szakaszában adjuk meg az ismert szortok neveit és a konstruktorok szignatúráit.
A szortot nevének leírásával deklaráljuk és definiáljuk a szakasz sorts
kezdetű blokkjában. A blokkot nem zárjuk le speciális kulcsszóval.
A szortok rendelkezhetnek paraméterekkel; ezeket a név után zárójelben, vesszővel elválasztva sorolhatjuk fel. Figyeljünk arra, hogy a paraméterek nem ütközhetnek a modulba importált és a modulban definiált szortok neveivel. Beépített szort a List(a)
, aminek a lista-termek felelnek meg.
Speciális a rendezett n-es (tuple) szortja. Jelölése: (s1,s2,...,sn)
A konstruktorok a funkcionális nyelvekből ismert adatkonstruktornak megfelelőek: függvényként viselkednek, melyek a paraméterként megadott termek alapján új, adott szortú termet hoznak létre. Deklarációjuk és definíciójuk a constructors
szakaszban történik. A konstruktor általános formája: név : s1*s2*...*sn -> s
, ahol si
az i. paraméter szortja. A név elhagyása esetén kötelezően n=1.
Például aritmetikai kifejezések egy nyelvének szignatúrája:
Ez a szignatúra többek között a következőeket fogalmazza meg:
Id
és Exp
szortokról beszélünk,String
szortú term Id
szortú is,Var
egyparaméteres konstruktor, amely egy Id
szortú termből Exp
szortú termet konstruál (azaz az előzővel együtt: Var("abcd")
szortja Exp
)Mul
kétparaméteres konstruktor, amely két Exp
szortú termből Exp
szortú termet hoz létre - azaz pl. Mul(Int(1),Int(2))
szortja Exp
App
kétparaméteres konstruktor: első paramétere Id
szortú, a második pedig Exp
szortú termek listája. Például: App("^",[Int(1),Int(2)])
szortja Exp
.
Az elméleti keretek ugyan adottak, de a jelenlegi verzióban a fordító nem ellenőriz szignatúra-helyességet - tetszőleges ATermek megadhatók; olyanok is melyeknek van olyan konstruktoros résztermje, mely nem felel meg egyszetlen megadott szignatúrának sem. A fordító a szignatúrákat csak az aritás ellenőrzésére használja. Mindazonáltal javasolt, hogy a programozó szort-helyesen készítse programjait; ezzel sok hibától kímélheti meg magát, s egy jövőbeli ellenőrző fordító is hatékonyabban használható.