Rod (teorie typu)

Rod v teorii typů ( anglicky  kind [1] ) je typem konstruktoru typu nebo formálněji typem operátoru typu vyššího řádu . Genderový systém je přirozeně reprezentován jako nadřazený (nadřazený) jednoduše typovaný lambda kalkul , vybavený primitivním typem, označovaným " *" (čti " typ "), tvořící jakési monomorfní datové typy .

Ještě jasněji, rod je typ typů nebo metatyp  – stejně jako množina hodnot tvoří typ , množina typů tvoří rod [2] . Výskyt typů v obecnějších typech (jako podtypy) se přitom liší od příslušnosti typů k rodu – k rozdělení různých typů do rodů dochází na abstraktnější úrovni. Například typy " natural ", " integer " a " real " jsou podtypy obecnějšího typu " number "; všechny čtyři typy představují bezprostřední hodnoty, a proto patří do rodu " *". Jiné rody jsou tvořeny z různých operací na typech  , stejně jako aritmetika rozlišuje mezi čísly a operacemi s čísly .

Bylo by syntakticky přirozené uvažovat o všech polymorfních typech jako o typových konstruktérech ; a podle toho všechny monomorfní jsou konstruktory nulárního typu . Všechny nulové konstruktory, tedy všechny monomorfní typy, však ve skutečnosti patří do stejného rodu, totiž " *".

Protože operátory typu vyššího řádu jsou ve většině programovacích jazyků neobvyklé, v programovací praxi se k rozlišení datových typů od typů konstruktorů používaných k implementaci parametrického polymorfismu používají pohlaví . Pohlaví se objevují explicitně nebo implicitně v jazycích s kompletními typovými systémy , jako je Haskell a Scala [3] .

Příklady

Obecný závěr v Haskell

Haskell poskytuje polymorfní typy, ale neumožňuje polymorfní rody [5] . Například v této definici polymorfního algebraického typu

Strom dat z = List | Vidlice ( Strom z ) ( Strom z )

zmůže být jakéhokoli pohlaví, včetně „ “, „ “ atd. Ve výchozím nastavení Haskell vždy odvozuje pohlaví „ “, pokud není uvedeno jinak (viz níže). Proto kontrola konzistence typu odmítne následující pokus o použití typu : Tree

type FunnyTree = Strom [] -- chyba

protože typ []je rodu " ", což není očekávaný rod pro , což je vždy " ". z

Operátoři typu vyššího řádu jsou však povoleni. Například,

data App unt z = Z ( unt z )

patří do rodu „ “ , to znamená, že to musí být unární konstruktor , ale zde bere typ jako argument a vrací jiný typ. unt

Viz také

Poznámky

  1. V ruskojazyčné literatuře neexistuje žádný osvědčený překlad termínu „ druh “ . Existují takové možnosti překladu jako " druh ", " seřadit ", " typ "
  2. Pierce, 2012 , Kapitola 29. Typové operátory a druhy.
  3. Generikum vyššího druhu . Získáno 30. září 2017. Archivováno z originálu 10. června 2012.
  4. Pierce, 2012 , Kapitola 32. Rozšířený příklad: Čistě funkční objekty.
  5. Haskell dokumentace používá stejnou šipku pro oba typy funkcí a rody

Literatura