Definíciók
Számos fejlesztések vannak a definíciók alapformájára a rekordokban.
Signatura definíciók
Haskell stílusú definíciók típus szignatúrával és egy definíció használható
defn ::= labelid :: type ; labelid = expr
Pl:
x :: Int;
x = 5;
Függvény definíciók
Haskell stílusú függvény definíciók használhatók, amikor egy
definíció jobb oldala egy lambda kifejezés a kötött változók balra
mozdíthatók. Ha a szignatura jo a valtozók típusa elhagyható.
defn ::= labelid :: type ; labelid
varid ... = expr
Pl:
inc :: Int->Int;
inx x = x+1;
Függvény definíciók minta összehasonlitás által
Függvények definiálhatók minta összehasonlítással, mint a Haskellben.
Helyettesító jelek is használhatók, '_'.
Pl:
not :: Bool -> Bool;
not (False) = True;
not (True) = False;
Minták a Cayenne-ban hasonlítanak a Haskell mintáira.
defn ::= labelid :: type ; labelid
pat ... = expr
pat ::= _ | varid | varid@pat | (conid
pat ... )
Típus definíciók
Típusok
# definícióira van egy speciális rövidítés.
A
:: # rész elhagyható ha a kulcsszó
type kitalálható a definícióból. Azonkívül, ha a
type definíció argumentumának van típusa, akkor a
#
rész elhagyható.
defn ::= type labelid vardecl ... = type
vardecl ::= varid | ( varid :: type )
Pl:
type MyInt = Int;
type PairX a = Pair a a;
Adat típus definíciók
Amikor adat típusokat definiálunk átlagos neveket szeretnénk adni a
konstruktoroknak. Haskell stílusú adat típus definíció definiál
egy típust és egy konstruktort egyidőben.
defn ::= data labelid vardecl ... = condef | ...
Pl:
data Bool = False | True;
iekvivalens
Bool :: # = data False | True;
False :: Bool = False@Bool;
True :: Bool = True@Bool;
Pl:
data List a = Nil | Cons a (List a);
ekvivalens
List :: # -> # = \ (a :: #) -> data Nil | Cons a (List a);
Nil :: (a :: #) |-> List a = Nil@(List a);
Cons :: (a :: #) |-> a -> List a -> List a = Cons@(List a);
Open definíció
Az
open definíció kényelmes útról
gondoskodik, hogy elérjük egy rekord néhány komponensét
és lokálisan használjuk más rekordokon belül.
defn ::= open expr use [modifier] varid :: type [ =
varid ], ... ;
A definíció
open e use i1::t1=i1', i2::t2=i2', ... ;
(szemantikailag) akvivalens a következővel
private i1::t1 = e.i1'; private i2::t2 = e.i2'; ...
Ha a második varid -t elhagyjuk ugyan azt szimulálja mint az
első. A típusok elhagyhatók. Tehát csak annyi is elég, hogy
open e use i1, i2, ... ;
Az alap láthatósága private, de ez semmibe vehető
akármelyik open definíció elejében, vagy egyénileg.
Kihagyható típus szignatúrák
Ha a definíció nem függvény definíció és nem rekurzív
(vagy kölcsönös rekurzív csoport tagja) a típus szignatúra
mindíg eldobható.
Pl:
struct { x = 5; y = 7; }
Típus szignatúra kihagyható még, ha a rekordnak amiben a definició
bekövetkezik van típus szignatúrája.