Angenommen, ich habe den folgenden Code:Wie kann ich GHC dazu bringen, Instanzen von Data.Type für GADTs mit Typable im Kontext zu generieren?
{-# LANGUAGE GADTs, DeriveDataTypeable, StandaloneDeriving #-}
import Data.Typeable
class Eq t => OnlyEq t
class (Eq t, Typeable t) => BothEqAndTypeable t
data Wrapper a where
Wrap :: BothEqAndTypeable a => a -> Wrapper a
deriving instance Eq (Wrapper a)
deriving instance Typeable1 Wrapper
Dann arbeitet die folgende Instanzdeklaration, ohne eine Einschränkung t
:
instance OnlyEq (Wrapper t)
und tut, was ich erwarten, dass es zu tun.
Aber die folgende Instanzdeklaration nicht funktioniert:
instance BothEqAndTypeable (Wrapper t)
seit GHC - Ich 7.6.1 mit - beklagt, dass:
No instance for (Typeable t)
arising from the superclasses of an instance declaration
Possible fix:
add (Typeable t) to the context of the instance declaration
In the instance declaration for `BothEqAndTypeable (Wrapper t)'
Typeable t
dem Kontext hinzufügen funktioniert natürlich. Aber fügt auch die folgende Instanz hinzu:
instance Typeable (Wrapper t) where
typeOf (Wrap x) = typeOf1 (Wrap x) `mkAppTy` typeOf x
Gibt es eine Möglichkeit, GHC diese letzte Instanz für mich zu schreiben? Wenn das so ist, wie? Wenn nicht, warum nicht?
Ich habe gehofft, GHC Lage wäre, den Typeable
Zwang aus dem Kontext auf dem Wrap
Konstruktor zu ziehen, so wie es mit der Eq
Einschränkung tat. Ich denke, dass meine Probleme darauf hinauslaufen, dass GHC explizit das Schreiben von deriving instance Typeable (Wrapper t)
verbietet, und die Standard (Typeable1 s, Typeable a) => Typeable (s a)
Instanz kann nicht nach innen schauen s a
, um ein Typeable a
Wörterbuch zu finden.
Richtig, ich vergesse immer die Feinheiten von 'undefined', da ich normalerweise etwas in meinen Datentypen speichere :-) Ich denke, ich brauche eine Art 'Newtype' GADTs, dann! Und eine zusätzliche Frage, wenn ich kann: ist die unbeschränkte 'Typable (Wrapper t)' -Instanz, die ich in irgendeiner Weise schlecht geschrieben habe, vorausgesetzt, es ist mir egal, dass 'typeOf (Fehler" aargh ":: Wrapper Bool)" ausfällt? – yatima2975
Nun, es ist eine leicht überraschende Instanz, da Sie es nicht mit 'undefined :: Wrapper Bool' wie anderen' Typable' Instanzen verwenden können. Wenn Sie das öffentlich machen, warnen Sie zumindest davor. Aber ich denke nicht, dass dich das unbedingt aufhalten sollte. Zukünftig werden GHC-Releases jedoch - von 7.8 an gerechnet - alle "Typable" -Instanzen von GHC und für alle Typen von iirc bereitgestellt. Sie müssen sich also nicht mit solchen Problemen befassen. –
Mit Blick auf das Repository benötigen Sie '-XAutoDeriveTypeable'. Cool! Ich denke, ich * könnte * nur gehen und 7.8.1 über das Wochenende dafür klonen, aber das letzte Mal, dass ich GHC gebaut habe, war 2002 (früher 6.x Zyklus?), Also ist das ein bisschen gruselig ... Aber danke nochmal! – yatima2975