2015-08-21 14 views
5

Haskell öğretici tip kinds temellerini tanıtan bir bölümü vardır veNeden benim türümün sonunda '-> Kısıtlama' var? Ben girdiğinizde okuyorum

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

Anlıyorum tür sahip olarak bir tür sınıf

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

açıklar, ancak :k Tofu GHCi içinde, ben

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

olsun ve neden tür yapar Tofu, bu formu basitçe * -> (* -> *) -> * yerine mi kullanıyor?

cevap

6

t, türünde * -> (* -> *) -> * sınıfının tiptipidir. Bu,GHC tarafından türetilmiş türüdür, çünkü -XPolyKinds'un yokluğunda, GHC, tüm tür parametrelerini varsayılan olarak * türünde dener. Bu nedenle, GHC, a'un * türüne sahip olduğunu varsayar (imzanızdaki hiçbir şey bunu tek seçenek haline getirir). tür* -> * -> * sahiptir (->)

tip yapıcı. j a, (->) için bir parametre olarak göründüğünden, j a, tür * olmalıdır. GHC, a'un * türünde olduğundan, j, * türünde bir şey alan ve * türünde bir şey döndüren bir tür olduğunu varsayar. Böylece: ilk bağımsız a tür * sahiptir ve ikinci bağımsız j tür *->* çünkü t yana

j :: * -> * 

a ve j hem uygulanır, t, tür * -> (* -> *) -> * sahiptir ve genel tip t a jşart Aynı zamanda (->) türünün bir parametresi olduğundan * türüne sahiptir.

Sınıflar Foo a b hariç (sadece data Foo a b gibi) tipi parametreleri alarak sadece türleridir tür *Tofu t ederken tür özel bir tür Constraint sahiptir vardır. Böylece Tofu türüdür:

GHC gösterir
(* -> (* -> *) -> *) -> Constraint 

olarak. Constraint sadece kısıtlamalara verilen türdür. imza olarak

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

(Num a)türConstraint bir tip olduğunu.

+0

Neredeyse anlıyorum, ama yeni başlıyorum. Biraz detaylandırır mısın? – orome

+0

Aslında: 't tofu''ya bakarsam biraz daha az şifreli. Yine de biraz sisliyim. – orome

+0

bir güncelleme üzerinde çalışıyor – crockeea

İlgili konular