Genul în teoria tipurilor ( engleză kind [1] ) este tipul unui constructor de tip , sau mai formal, tipul unui operator de tip de ordin superior . Sistemul de gen este reprezentat în mod natural ca un calcul lambda parinte (superior) tip simplu , dotat cu un tip primitiv, notat cu „ *” (citește „ tip ”), formând un fel de tipuri de date monomorfe .
Mai clar, un gen este un tip de tipuri sau un metatip - așa cum un set de valori formează un tip , un set de tipuri formează un gen [2] . În același timp, apariția tipurilor în tipuri mai generale (ca subtipuri) diferă de apartenența tipurilor la un gen - împărțirea diferitelor tipuri în genuri are loc la un nivel mai abstract. De exemplu, tipurile „ natural ”, „ întreg ” și „ real ” sunt subtipuri de tipul mai general „ număr ”; toate cele patru tipuri reprezintă valori imediate și, prin urmare, aparțin genului " *". Alte genuri se formează din diferite operații asupra tipurilor , la fel cum aritmetica distinge între numere și operații pe numere .
Ar fi firesc din punct de vedere sintactic să ne gândim la toate tipurile polimorfe ca la constructori de tip ; și, în consecință, toate cele monomorfe sunt constructori de tip nular . Cu toate acestea, toți constructorii nuli, adică toate tipurile monomorfe, aparțin de fapt aceluiași gen, și anume " *".
Deoarece operatorii de tip de ordin superior sunt neobișnuiți în majoritatea limbajelor de programare , în practica de programare, genurile sunt folosite pentru a distinge tipurile de date de tipurile de constructoare utilizate pentru implementarea polimorfismului parametric . Genurile apar explicit sau implicit în limbile cu sisteme complete de tipare , precum Haskell și Scala [3] .
Haskell furnizează tipuri polimorfe, dar nu permite genurile polimorfe [5] . De exemplu, în această definiție a unui tip algebric polimorf
date Arborele z = Frunza | Furcă ( Arborele z ) ( Arborele z )zpoate fi de orice gen, inclusiv „ ”, „ ”, etc. În mod implicit, Haskell deduce întotdeauna genul „ ”, dacă nu se specifică altfel (vezi mai jos). Prin urmare, verificatorul de consistență de tip va respinge următoarea încercare de a utiliza tipul : Tree
tip FunnyTree = Arborele [] -- eroaredeoarece tipul []este al genului " ", care nu este genul așteptat pentru , care este întotdeauna " ". z
Cu toate acestea, sunt permise operatorii de tip de ordin superior. De exemplu,
date App unt z = Z ( unt z )aparține genului „ ” , adică trebuie să fie un constructor unar , dar aici ia un tip ca argument și returnează un alt tip. unt
Tipuri de date | |
---|---|
Ininterpretabil | |
Numeric | |
Text | |
Referinţă | |
Compozit | |
abstract |
|
Alte | |
subiecte asemănătoare |