2014-09-16 3 views
9

Я нашел интересную ситуацию при использовании типов данных с типами семейств.Семейные приложения типа Haskell не оцениваются

Сообщение об ошибке компилятора: No instance for (C (ID())) arising from a use of W. Это предполагает, что типовое семейное приложение не полностью оценивается, даже когда оно насыщено. :kind! ID() оценивается в (), поэтому в соответствии с порядком C().

{-# 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) 

Могу ли я каким-то образом заставить оценку ID()? Это ошибка компилятора?

Я использую GHC 7.8.3

+0

Как (ID()) оценивает что-либо? Для семейства ID нет экземпляров. – augustss

+0

Я написал его как закрытое семейство типов (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –

+0

Написание его как семейства нормального типа не изменяет ошибку. –

ответ

2

Проблема является своего рода ConstID.

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