2015-08-21 9 views
5

Tutorial Haskell Czytam posiada sekcję wprowadzającą podstawy typu kinds i opisuje klasę TYPDlaczego mój typ ma na końcu "-> ograniczenie"?

class Tofu t where 
    tofu :: j a -> t a j 

jako posiadające rodzaj

* -> (* -> *) -> * 

Rozumiem to, ale gdy wchodzę :k Tofu w GHCi, mam

Tofu :: (* -> (* -> *) -> *) -> GHC.Prim.Constraint 

Co jest GHC.Prim.Constraint i dlaczego ten rodzaj Tofu ma ten formularz, a nie po prostu * -> (* -> *) -> *?

Odpowiedz

6

t to parametr typu klasy Tofu rodzaju * -> (* -> *) -> * (napisany t :: * -> (* -> *) -> *). To jest wywnioskowany typ t według GHC, ponieważ pod nieobecność -XPolyKinds, GHC próbuje ustawić domyślne wszystkie parametry typu na rodzaj *. Tak więc GHC zakłada, że ​​a ma rodzaj * (chociaż nic w twoim podpisie nie czyni tego jedynym wyborem).

konstruktor typ (->) ma rodzaju* -> * -> *. Od j a pojawia się jako parametr do (->), j a musi mieć rodzaj *. Ponieważ GHC założył, że a ma rodzaj *, j jest typem, który przyjmuje coś w rodzaju * i zwraca coś w rodzaju *. Zatem:

j :: * -> * 

Od t jest stosowana zarówno a i j, t ma rodzaj * -> (* -> *) -> *, ponieważ pierwszy argument a ma rodzaj * i drugi argument j ma rodzaj *->*, a ogólny typ t a jkoniecznością mają rodzaj *, ponieważ jest to również parametr typu (->).

Klasy są tylko typy przyjmujący parametry typu (podobnie jak data Foo a b), z wyjątkiem rodzaju *Foo a b ma natomiast Tofu t ma rodzaj specjalnego rodzaju Constraint. Tak więc rodzaj Tofu jest:

(* -> (* -> *) -> *) -> Constraint 

jak wskazuje GHC. Constraint jest właśnie takim rodzajem ograniczeń. W podpisie

(Num a) => a -> a -> a 

(Num a) jest typ z rodzajuConstraint.

+0

Prawie rozumiem, ale jestem początkujący. Czy możesz trochę rozwinąć? – orome

+0

To jest trochę mniej zagadkowe, gdy patrzę na ': t tofu', faktycznie. Chociaż wciąż jestem trochę zamglony. – orome

+0

pracuje teraz nad aktualizacją – crockeea

Powiązane problemy