2012-03-25 19 views
10

ben Haskell wiki kitaplar aracılığıyla gidiyorumTür İmzalar

https://en.wikibooks.org/wiki/Haskell/GADT kılavuzu GADTS.

Kons Konstrüktörün kısıtlanmış türünü genelleştiren bir Tür imzası eklenene kadar oldukça iyi bir şekilde izliyordum. Güvenli ve güvenli olmayan MarkedLists hem karşı ben inşa etmek Eksileri kurucu kullanabilirsiniz Tür İmza ve desen eşleme ile

data Safe 
data NotSafe 

data MarkedList    :: * -> * -> * where 
    Nil      :: MarkedList t NotSafe 
    Cons      :: a -> MarkedList a b -> MarkedList a c 

safeHead     :: MarkedList a Safe -> a 
safeHead (Cons x _)   = x 


silly 0      = Nil 
silly 1      = Cons() Nil 
silly n      = Cons() $ silly (n-1) 

. Ne olup bittiğimi anladığım halde, ne yazık ki, Tip İmzanın buna nasıl izin verdiğine dair herhangi bir sezgi oluşturmada sorun yaşıyorum. Neden İmza'ya ihtiyacım var? Nazım İmza ne yapıyor?

cevap

12

Aynı şekilde, değerler için bir tür imza çalışır, türler için bir tür imza çalışır.

f :: Int -> Int -> Bool 
f x y = x < y 

Burada, f iki argüman değerini alır ve bir sonuç değeri üretir. türleri için eşdeğer olabilir:

data D a b = D a b 

tipi D iki bağımsız değişken türleri alır ve bir sonuç türünü (* -> * -> * olan) üretir. Örneğin, D Int String bir türdür (* türünde). Kısmi uygulama D Int, 'un kısmi uygulamasının Int -> Bool tipinde olduğu gibi, * -> * türüne sahiptir.

yüzden yazabilirsiniz yukarıdaki:

data D :: * -> * -> * where 
    D :: a -> b -> D a b 

GHCi olarak, türleri ve çeşitleri sorgulayabilir:

Im hala MarkedList ab `beri karıştı
+0

...' iş gibi görünüyor

> :type f f :: Int -> Int -> Bool > :kind D D :: * -> * -> * 
GHC 7.4.1'de aswell. Ne tür bir imza sağladığından emin değilim. – ExternalReality

+1

Bu bana aynı şeyi söylemenin alternatif bir yolu gibi görünüyor. –

+0

Evet, ancak Kind İmzanın, ikincisi yoksa bir dil pragmaya ihtiyacı vardır. Neden, her iki yol aynıysa? Kind İmzası ne kadar ekstra sağlar? – ExternalReality