Sto assemblando una libreria di geometrie in haskell. Non ho intenzione di rilasciarlo, è solo un progetto che sto usando per migliorare la mia conoscenza della lingua.Typeclasses e GADT
Ho un tipo di dati Local
, con la seguente definizione
data Local a where
MkLocal :: (Vectorise a) => ReferenceFrame -> a -> Local a
Un frame di riferimento è un vettore indicando l'origine del telaio ed un angolo che rappresenta la rotazione del telaio, sia wrt definito il "assoluto "schema di riferimento (hey, non è il mondo reale!). Una geometria Vectorise
è una che ha una trasformazione invertibile in una lista di Vector
.
mi venne in mente che locale potrebbe essere un esempio di Functor
come segue:
instance Functor Local where
fmap f geom = localise (frame geom) (f $ local geom)
ma il compilatore si lamenta che non v'è alcuna istanza di Vectorisable per l'uso di localizzare nella definizione. C'è qualche modo per aggirare questa limitazione usando una delle innumerevoli estensioni GHC?
EDIT: Come richiesto nei commenti, qui sono alcuni dei tipi utilizzati
local :: Local a -> a
frame :: Local a -> ReferenceFrame
localise :: (Vectorise a) => ReferenceFrame -> a -> Local a
L'errore è
No instance for (Vectorise b)
arising from a use of `localise'
In the expression:
localise (frame geom) (f $ local geom)
In an equation for `fmap':
fmap f lgeom = localise (frame geom) (f $ local geom))
In the instance declaration for `Functor Local'
che ha un senso, perché il tipo di fmap
è (a -> b) -> f a -> f b
. Si può dedurre che a
deve essere un'istanza di Vectorise
, ma mi chiedevo come potesse dedurre che b
fosse, a meno che non potessi specificare (in qualche modo) potrei dire al compilatore che f
deve avere il tipo di restrizione limitato senza definire un altro typeclass quando è già uno che quasi si adatta già al disegno di legge (o in alternativa, se qualcuno potrebbe utilmente spiegare perché limitando le classi in questo modo si romperebbe l'inferenza di tipo in qualche modo).
ps. Ho anche sistemato un errore di battitura in cui avevo invertito local
e frame
invertiti nella definizione di fmap
Mostraci i tipi di 'localise',' local' e 'frame' e il messaggio di errore che ottieni. La mia ipotesi è che manchi 'istanza Vectorise' per' Local'. –
Fatto. Ho provato ad aggiungere la dichiarazione di istanza, ma non ha aiutato. È il tipo di ritorno di 'f' che devo dichiarare come' Vectorise' per quanto posso vedere, non 'Local a'. – ovangle