Supponiamo che io ho il seguente codice:Come posso ottenere GHC per generare istanze di Data.Typeable per GADTs con Typeable nel contesto?
{-# 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
Poi, la seguente dichiarazione di istanza funziona, senza un vincolo sulla t
:
instance OnlyEq (Wrapper t)
e fa quello che mi aspetto di fare.
Ma la seguente dichiarazione di istanza non funziona:
instance BothEqAndTypeable (Wrapper t)
dal GHC - sto usando 7.6.1 - lamenta che:
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)'
Aggiunta Typeable t
al contesto funziona, ovviamente. Ma così aggiunge l'istanza seguente:
instance Typeable (Wrapper t) where
typeOf (Wrap x) = typeOf1 (Wrap x) `mkAppTy` typeOf x
C'è un modo per ottenere GHC per scrivere quest'ultima istanza per me? Se é cosi, come? Se no, perché no?
Speravo che GHC fosse in grado di estrarre il vincolo Typeable
dal contesto nel costruttore Wrap
, proprio come ha fatto con il vincolo Eq
. Penso che i miei problemi si riducano al fatto che GHC non consente esplicitamente di scrivere deriving instance Typeable (Wrapper t)
e l'istanza standard (Typeable1 s, Typeable a) => Typeable (s a)
non può "cercare all'interno" s a
per trovare un dizionario Typeable a
.
Destra, continuo a dimenticare i punti più fini di "indefinito" poiché di solito immagazzino qualcosa nei miei tipi di dati :-) Penso di aver bisogno di una sorta di GADT 'newtype', quindi! E un'ulteriore domanda, se posso: è l'istanza non costruibile 'Typeable (Wrapper t)' che ho scritto in qualche modo male, a patto che non mi interessi che 'typeOf (errore" aargh ":: Wrapper Bool)' ritorna in basso? – yatima2975
Beh, è un'istanza un po 'sorprendente dal momento che non puoi usarla con 'undefined :: Wrapper Bool' come le altre istanze' Typeable'. Se lo fai pubblico, metti almeno un avvertimento su di esso. Ma non penso che dovrebbe necessariamente fermarti. Nelle future versioni di GHC, tuttavia, a partire dal 7.8, tutte le istanze 'Typeable' saranno fornite da GHC e, per tutti i tipi, iirc. Quindi non dovrai più affrontare questi problemi. –
Guardando il repository, avrai bisogno di '-XAutoDeriveTypeable'. Freddo! Penso che * potrei * andare a clonare 7.8.1 nel fine settimana per quello, ma l'ultima volta che ho costruito GHC è stato nel 2002 (inizio del ciclo 6.x?), Quindi è un po 'spaventoso ... Ma grazie ancora! – yatima2975