2014-09-16 11 views
9

Ho trovato una situazione interessante, quando si utilizzano tipi di dati con famiglie di tipi.Le applicazioni familiari di tipo Haskell non vengono valutate

Il messaggio di errore del compilatore è No instance for (C (ID())) arising from a use of W. Suggerisce che un'applicazione di tipo familiare non è completamente valutata, anche quando è satura. :kind! ID() restituisce (), pertanto è necessario utilizzare l'istanza 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) 

Potrei in qualche modo forzare la valutazione di ID()? È un bug del compilatore?

sto usando GHC 7.8.3

+0

In che modo (ID()) si valuta nulla? Non ci sono casi per la famiglia di ID. – augustss

+0

L'ho scritto come famiglia di tipo chiuso (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –

+0

Scrivendolo come una normale famiglia di tipi non cambia l'errore. –

risposta

2

Il problema è il tipo di ConstID.

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