2011-12-16 3 views
9

Düzenleme: İşte gerçekten basit bir örnek. Aşağıdaki bu örnek için motivasyon.ghci'nin sonlandırılmış tür imgesini eklemek için bir hata neden olur

{-# LANGUAGE TypeFamilies #-} 

type family F a b 

f :: a -> F a b 
f = undefined 

f' [a] = f a 

Ve GHCi bildirir:

Bu derler Yukarıda dosyaya bu tür imza eklemek Ama eğer şikayet

*Main> :t f' 
f' :: [a] -> F a b 

:

*Main> :r 
[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:9:14: 
    Couldn't match type `F a b0' with `F a b' 
    NB: `F' is a type function, and may not be injective 
    In the return type of a call of `f' 
    In the expression: f a 
    In an equation for `f'': f' [a] = f a 
Failed, modules loaded: none. 

Ne verir ?


Motivasyon:

this question gördükten sonra ben bir akıllı Alec olmak ve biraz şaka çözümü yazmak düşündüm. Saldırı planı, (her zamanki gibi) tip düzeyindeki sayılarla başlayıp, Args n a c tipini yazıp a kopyasını alan ve c değerini veren işlev türünü yazacaktır. Sonra çeşitli n için biraz tip sınıf yazabilir ve yolumuza devam edebiliriz. İşte yazmak istiyorum ne:

{-# LANGUAGE TypeFamilies #-} 

data Z = Z 
data S a = S a 

type family Args n a c 
type instance Args Z a c = c 
type instance Args (S n) a c = a -> Args n a c 

class OnAll n where 
    onAll :: n -> (b -> a) -> Args n a c -> Args n b c 

instance OnAll Z where 
    onAll Z f c = c 

instance OnAll n => OnAll (S n) where 
    onAll (S n) f g b = onAll n f (g (f b)) 

Bu tip kontrol bulunmadığı ortaya şaşırdı!

+0

Bu, bu örneği sadeleştirmeye adamış olduğumdan kesinlikle daha fazla çaba gerektirir! Hangi GHC sürümünü kullanıyorsunuz, bunu denemeden önce çok derinden kazıyorsunuz? – ehird

+0

@ehird ghc-7.2.2 ve ghc-7.3.20111114 ile kontrol ettim. –

+0

(Şüphelerim, FWIW, bu GHC'deki bir hatadır. Ancak, NB: 'Args'ın bir tür işlevi olduğunu ve enjekte edilemeyebileceğini düşünüyorum. nasıl: t, tip denetleyicinin kendisinden ziyade isimleri veya benzerlerini gösterir.) – ehird

cevap

9

aşağıdaki hususlar ile ispat edilebilir gibi bu bir GHC hata, daha da basitleştirilmiş bir örnek: Ben GHC HQ Bildirmeden öneririz

type family F a 

f :: b -> F a 
f = undefined 

f' :: b -> F a 
f' a = f a 

.

+0

Güzel bahşiş. Seni hala daha iyi yapacağım: 'tip F ailesi; x, y :: F a; x = tanımsız; y = x'. –

+0

Ha! Bunu IRC'den daha öncekilerden daha basit bir örnekte düzenlemeden önce 29 saniyede başardınız. Eh, en azından şimdi bir hata olduğundan emin olabiliriz ... – ehird

+1

Bu cevabı kabul etmek; hızlı bir güncelleme vermek için, bu "hata" (?), bir tür açıklama durağı derleme olmadan sürümü yaparak GHC'de çözüldü. =) –