2014-09-16 11 views
9

Ich fand eine interessante Situation, wenn Sie Datenarten mit Typfamilien verwenden.Haskell Typ Familienanwendungen werden nicht ausgewertet

Die Fehlermeldung des Compilers lautet No instance for (C (ID())) arising from a use of W. Es deutet darauf hin, dass eine Anwendung der Typfamilie nicht vollständig ausgewertet wird, selbst wenn sie gesättigt ist. :kind! ID() wertet () aus, so sollte gemäß der C() Instanz verwendet werden.

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

Könnte ich irgendwie die Auswertung von ID() erzwingen? Ist es ein Compilerfehler?

Ich verwende GHC 7.8.3

+0

Wie bewertet (ID()) zu irgendetwas? Es gibt keine Instanzen für die ID-Familie. – augustss

+0

Ich schrieb es als eine geschlossene Familie (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –

+0

Schreiben Sie es als eine normale Familie Typ ändert sich nicht den Fehler. –

Antwort

2

Das Problem ist die Art von ConstID.

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