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
Wie bewertet (ID()) zu irgendetwas? Es gibt keine Instanzen für die ID-Familie. – augustss
Ich schrieb es als eine geschlossene Familie (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –
Schreiben Sie es als eine normale Familie Typ ändert sich nicht den Fehler. –