Voglio implementare un Type Class
con alcuni metodi predefiniti, ma sto ricevendo un errore, che non riesco a utilizzare record selectors
all'interno delle definizioni type classes
.Selettori di record nelle classi di tipi Haskell
Il codice seguente crea fondamentalmente type class
che definisce add
funzione, che deve aggiungere un elemento al repr
record di qualche data type
. Ecco il codice:
import qualified Data.Graph.Inductive as DG
class Graph gr a b where
empty :: DG.Gr a b
empty = DG.empty
repr :: gr -> DG.Gr a b
-- following function declaration does NOT work:
add :: a -> gr -> gr
add el g = g{repr = DG.insNode el $ repr g}
Il compilatore genera un errore:
repr is not a record selector
In the expression: g {repr = DG.insNode el $ repr g}
In an equation for add:
add el g = g {repr = DG.insNode el $ repr g}
E 'possibile dichiarare tali metodi a Haskell?
Chiarimento
ho bisogno di tale progetto perché ho avuto qualche data types
, che si comportano in modo simmilar. Diciamo, abbiamo ottenuto A
, B
e C
data types
. Ciascuno di essi deve avere un record repr :: DG.Gr a b
, dove a
e sono distinti per ciascuno di A
, B
e C
.
A
, B
e C
condividono le stesse funzioni, come add
o delete
(che in pratica aggiungere o eliminare elementi per registrare repr
). Se questi tipi di dati condividono molte funzioni, è opportuno implementare le funzioni in type class
e creare istanze di questo type class
- queste funzioni verranno implementate automaticamente per ciascuno dei nostri data type
.
Ulteriori mi piacerebbe alcuni di questi data types
(diciamo che voglio B
) comportarsi leggermente diverso quando si chiama la funzione add
su di esso. È facile implementare questo comportamento quando si effettua instance
di type class
per B
.
la risposta è "no", ma "più o meno, usando gli obiettivi", ma, cosa più importante, sento che c'è un malinteso fondamentale su quali classi ci siano da qualche parte qui. Sarebbe di grande aiuto se dicessi _why_ vuoi avere una tale classe; potremmo essere in grado di suggerire un'alternativa più idiomatica. –
@DanielWagner - Ho aggiunto un chiarimento per il problema che sto cercando di risolvere - Spero che ora sia abbastanza chiaro, perché sto cercando di farlo :) –
Vedere la mia risposta aggiornata. Nel secondo esempio, utilizzo il metodo 'update' che esegue l'aggiornamento effettivo (può essere implementato utilizzando la sintassi di aggiornamento del record nelle istanze) e il terzo esempio utilizza' Control.Lens'. – JJJ