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
In che modo (ID()) si valuta nulla? Non ci sono casi per la famiglia di ID. – augustss
L'ho scritto come famiglia di tipo chiuso (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –
Scrivendolo come una normale famiglia di tipi non cambia l'errore. –