Gen (teoria tipurilor)

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] .

Exemple

Inferență generică în Haskell

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 [] -- eroare

deoarece 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

Vezi și

Note

  1. ↑ Nu există o traducere bine stabilită a termenului „ tip ” în literatura de limbă rusă . Există opțiuni de traducere precum „ fel ”, „ sort ”, „ type ”
  2. Pierce, 2012 , Capitolul 29. Tip Operatori și Tipuri.
  3. Generic de tip superior . Consultat la 30 septembrie 2017. Arhivat din original la 10 iunie 2012.
  4. Pierce, 2012 , Capitolul 32. Exemplu extins: Obiecte pur funcționale.
  5. Documentația Haskell folosește aceeași săgeată atât pentru tipurile de funcții, cât și pentru genuri

Literatură