Druh (teorie typů) - Kind (type theory)
![]() | tento článek může být pro většinu čtenářů příliš technická na to, aby je pochopili. Prosím pomozte to vylepšit na aby to bylo srozumitelné pro neodborníky, aniž by byly odstraněny technické podrobnosti. (Červen 2020) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) |
V oblasti matematická logika a počítačová věda známý jako teorie typů, a druh je typ a konstruktor typu nebo méně často typ a operátor typu vyššího řádu. Laskavý systém je v zásadě a jednoduše zadaný lambda kalkul „o úroveň výš“, označený primitivním typem, označený a nazývá se „typ“, což je jakýkoli druh datový typ který žádné nepotřebuje parametry typu.
Druh je někdy matoucí popisován jako „typ a (datový typ ", ale ve skutečnosti jde spíše o arity specifikátor. Syntakticky je přirozené považovat polymorfní typy za konstruktory typů, tedy nepolymorfní typy za nullary konstruktory typu. Ale všechny nullary konstruktory, tedy všechny monomorfní typy, mají stejný, nejjednodušší druh; a to .
Vzhledem k tomu, že operátoři typu vyššího řádu jsou neobvyklí programovací jazyky Ve většině programovacích postupů se druhy používají k rozlišení mezi datovými typy a typy konstruktorů, které se používají k implementaci parametrický polymorfismus. Druhy se objevují, ať už explicitně, nebo implicitně, v jazycích, jejichž typové systémy zohledňují parametrický polymorfismus programově přístupným způsobem, například C ++,[1] Haskell a Scala.[2]
Příklady
- , vyslovuje se „typ“, je druh všeho typy dat viděn jako nullary konstruktory typů a v tomto kontextu se také nazývají správné typy. To obvykle zahrnuje typy funkcí v funkční programovací jazyky.
- je druh a unární konstruktor typu, např. a typ seznamu konstruktor.
- je druh a binární konstruktor typu (přes kari ), např. a typ páru konstruktor, a také to a typ funkce konstruktor (nezaměňovat s výsledkem jeho aplikace, která je sama o sobě typem funkce, tedy druhu )
- je druh operátoru typu vyššího řádu od konstruktérů unárního typu po správné typy.[3]
Druhy v Haskellu
(Poznámka: Dokumentace Haskell používá stejnou šipku pro typy i druhy funkcí.)
Laskavý systém Haskell 98[4] zahrnuje přesně dva druhy:
- , vyslovovaný „typ“ je druh všeho typy dat.
- je druh a unární konstruktor typu, který má určitý druh druhu a vytváří druh druhu .
Obydlený typ (jak se správné typy v Haskellu nazývají) je typ, který má hodnoty. Například ignorování tříd typu které komplikují obraz, 4
je hodnota typu Int
, zatímco [1, 2, 3]
je hodnota typu [Int]
(seznam Ints). Proto, Int
a [Int]
mít laskavý , ale stejně tak funguje jakýkoli typ funkce Int -> Bool
nebo dokonce Int -> Int -> Bool
.
Konstruktor typu přebírá jeden nebo více argumentů typu a produkuje datový typ, když je zadán dostatek argumentů, tj. Podporuje částečná aplikace díky kari.[5][6] Takto Haskell dosahuje parametrických typů. Například typ []
(list) je konstruktor typu - k určení typu prvků seznamu je potřeba jediný argument. Proto, [Int]
(seznam bodů), [Plovák]
(seznam plováků) a dokonce [[Int]]
(seznam seznamů Ints) jsou platné aplikace []
konstruktor typu. Proto, []
je druh druhu . Protože Int
má laskavý , přihlašování []
má za následek [Int]
, svého druhu . 2-n-tice konstruktor (,)
má laskavý , konstruktor 3 řazené kolekce členů (,,)
má laskavý a tak dále.
Laskavý závěr
Standardní Haskell neumožňuje polymorfní druhy. To je v rozporu s parametrický polymorfismus na typech, které podporuje Haskell. Například v následujícím příkladu:
data Strom z = List | Vidlička (Strom z) (Strom z)
druh z
může být cokoli, včetně , ale také atd. Haskell ve výchozím nastavení vždy odvodí druhy, které mají být , pokud typ výslovně neurčuje jinak (viz níže). Proto kontrola typu odmítne následující použití Strom
:
typ FunnyTree = Strom [] - neplatný
protože ten druh []
, neodpovídá očekávanému druhu pro z
, což je vždy .
Jsou však povoleni operátoři vyššího řádu. Například:
data Aplikace ne z = Z (ne z)
má laskavý , tj. ne
se očekává, že bude unárním datovým konstruktorem, který se použije na jeho argument, kterým musí být typ, a vrátí jiný typ.
GHC má příponu PolyKinds
, který společně s Druh podpisů
, umožňuje polymorfní druhy. Například:
data Strom (z :: k) = List | Vidlička (Strom z) (Strom z)typ FunnyTree = Strom [] -- OK
Od verze GHC 8.0.1 jsou typy a druhy sloučeny.[7]
Viz také
Reference
- Pierce, Benjamin (2002). Typy a programovací jazyky. MIT Stiskněte. ISBN 0-262-16209-1., kapitola 29, „Operátoři a vazby typu“
- ^ „CS 115: Parametric Polymorphism: Template Functions“. www2.cs.uregina.ca. Citováno 2020-08-06.
- ^ Generika vyššího druhu
- ^ Pierce (2002), kapitola 32
- ^ Druhy - Zpráva Haskell 98
- ^ „Kapitola 4 Prohlášení a závaznost“. Haskell 2010 Language Report. Citováno 23. července 2012.
- ^ Miran, Lipovača. „Naučte se, že jste Haskell pro skvělé dobro!“. Vytváření vlastních typů a tříd. Citováno 23. července 2012.
- ^ https://downloads.haskell.org/~ghc/8.0.1/docs/html/users_guide/glasgow_exts.html#ghc-flag--XTypeInType