Mi sono imbattuto nel seguente piccolo problema. Sto usando la sintassi record di Haskell, insieme a GADTs:Uso della sintassi dell'aggiornamento del record con record GADT vincolati
{-# LANGUAGE GADTs #-}
data Test a where
Test :: {someString :: String, someData :: a} -> Test a
Ora voglio creare un nuovo valore Test
con un tipo diverso per someData
, ma lo stesso valore per someString
(per giustificare l'uso della sintassi Aggiorna record):
test :: Test a -> Test Bool
test t = t {someData = True}
Supponiamo che io aggiungo un altro campo alla Test
costruttore:
data Test a where
Test :: {someString :: String, someData :: a, someMoreData :: a} -> Test a
Poi Devo cambiare entrambi i campi per mantenere tipo corretto il mio codice:
test :: Test a -> Test Bool
test t = t {someData = True, someMoreData = False}
Fino ad ora, non ho bisogno del GADT, ma ora voglio aggiungere un vincolo di tipo classe per il tipo di dati, ad esempio Eq
:
data Test a where
Test :: Eq a => {someString :: String, someData :: a} -> Test a
Quando si cerca di campo "update" someData
, come nel primo esempio, ho improvvisamente ricevo un errore di compilazione:
Couldn't match type ‘a’ with ‘Bool’
‘a’ is a rigid type variable bound by
the type signature for test :: Test a -> Test Bool at Test.hs:18:9
Expected type: Test Bool
Actual type: Test a
Relevant bindings include
t :: Test a (bound at Test.hs:19:6)
test :: Test a -> Test Bool (bound at Test.hs:19:1)
In the expression: t
In the expression: t {someData = True}
ho il sospetto che questo sia lo stesso "p roblem "come nel caso precedente con due campi di tipo a
, ma un po 'più implicito. Immagino che il dizionario per la classe di tipo Eq
sia trattato come un argomento del costruttore, proprio come se avessi un campo {eqDict :: Eq a}
. Se ho ragione, ho dovuto anche "aggiornare" il "campo del dizionario" in qualche modo, anche se non so come farlo. La domanda è: esiste un modo per utilizzare la sintassi dell'aggiornamento dei record quando sono coinvolte classi di tipi come questa?
Peccato, suppongo di dover seguire la mia soluzione alternativa. Grazie per la pronta risposta. –