2013-07-05 29 views
6

Başlığın yeterince açıklayıcı olup olmadığından emin değilim, ancak Haskell'de pek tecrübem yok. BenTip tanımı (Haskell) tipinin tanımı (Haskell)

data Pair a b = Pair a b 
sahip

class MyTypeclass (ctor a b) where 
    funct :: (ctor a b) -> a 

varsayarak (ctor :: * -> * -> *, a :: *, b :: * varsayılarak) ve bu gibi, kurucu parametrize edildiği tipine bağlıdır, iki parametre tipi kurucular için typeclass olmak için

o (birden parametre tipi sınıfları olmadan mümkündür

instance MyTypeclass (Pair a b) where 
    funct :: Pair a b -> a 
    funct (Pair x _) = x 

gibi bir şey yapabilmek bunun nedeni' çok güçlü - sadece benim tipecamın parametrized olduğu türünü bozmak istiyorum)?

cevap

7

, bunu yüksek kinded türleri dikkate alınır "kurucu sınıfları" olarak adlandırılan kullanabilirsiniz Evet:

class C ctor where 
    funct :: ctor a b -> a 

instance C Pair where 
    funct (Pair x _) = x 

instance C (,) where 
    funct = fst  -- (a,b) -> a 
+0

teşekkürler! İşe yarıyor. Ama ben orada gerçekleşen tür çıkarım miktarı hakkında oldukça endişe duyuyorum - iki kurucu sınıfları ile iki parametreli bir yazım nasıl yapabilirim? Hangi türden geleceğini belirtmenin bir yoluna ihtiyacım var. –

+0

Endişenizi anladığımdan emin değilim - ama unutmayın: Sınıf değişkeni (burada "ctor") her sınıf işlevi imzasında görünmeli ve doğru türdeki argümanlara uygulanmalıdır. Bu nedenle, tüm tipler girişlerle sabitlenir. – Ingo

+0

Daha basit bir soru o zaman: "C Pair nerede" içinde "funct" ifadesinin açık tip imzasını verebilir misiniz? –