2014-09-16 17 views
9

Tip aileleriyle veri türlerini kullanırken ilginç bir durum buldum.Haskell tipi aile uygulamaları değerlendirilmiyor

Derleyicinin hata iletisi No instance for (C (ID())) arising from a use of W. Doymuş olsa bile, bir tip aile uygulamasının tam olarak değerlendirilmediğini gösterir. :kind! ID(), () için değerlendirir, bu nedenle C() örneğine göre kullanılmalıdır.

{-# LANGUAGE GADTs, TypeFamilies, UndecidableInstances, FlexibleContexts #-} 

type family ID t where 
    ID t = t 

class C t where 
instance C() where 

data W where 
    W :: C (AppID t) => P t -> W 

type family AppID t where 
    AppID t = (ConstID t)() 

type family ConstID t where 
    ConstID t = ID 

data P t where 
    P :: P t 

data A 

w :: W 
w = W (P :: P A) 

Bir şekilde ID() değerlendirmesini zorlayabilir miyim? Derleyici bir hata mı? Ben GHC 7.8.3

+0

(ID()) bir şeyi nasıl değerlendirir? Kimlik ailesi için örnek yoktur. – augustss

+0

Bunu kapalı tip bir aile olarak yazdım (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –

+0

Normal yazım ailesi olarak yazmak hatayı değiştirmez. –

cevap

2

sorun kullanıyorum

ConstID türüdür.

type family ConstID t a where 
    ConstID t a = ID a