(Scusatemi in anticipo se la domanda è stupida o ovvia - non ho molta esperienza con Haskell).In Haskell, c'è un modo per esprimere che un tipo dovrebbe essere un'istanza di un typeclass in più di un modo?
C'è un modo per esprimere che un tipo dovrebbe essere un'istanza di un typeclass in più di un modo? Questo è meglio illustrato con un esempio (che è probabilmente un po 'sciocco): in matematica, possiamo dire che un semiring è un insieme che è un monoide commutativo sotto una operazione (che chiameremo addizione, identità 0) e un monoide sotto un altro (che chiameremo moltiplicazione) insieme ai requisiti che la moltiplicazione distribuisce oltre l'aggiunta e che 0 annienta tutti gli elementi in moltiplicazione. Le ultime parti non sono importanti qui.
Supponiamo ora che ho un typeclass Monoid
(da non confondere con Data.Monoid
),
class Monoid m where
unit :: m
operation :: m -> m -> m
e vorrei creare un typeclass Semiring
. Dalla definizione di cui sopra, vorrei dire "se il tipo r è un monoid in due modi (distinti), lo chiameremo semiring". Quindi vorrei qualcosa come
class (Monoid r, Monoid r) => Semiring r where ...
che naturalmente non funziona. Certo, l'esempio diventa un po 'strano dal momento che non ci sono più funzioni che vorremmo richiedere per le semine, quindi il typeclass sarebbe vuoto, ma spero che illustri quello che sto chiedendo (o pretendiamo semplicemente che abbiamo bisogno di qualche funzione f:r->r
per Semiring r
).
Così, nel contesto generale, mi sto chiedendo: Dato un typeclass A
, c'è un modo per parametrizzare un typeclass B a
con il requisito che a
essere un'istanza di A
in due modi (il che significa che a
dovrebbe attuare la funzioni specificate da A
in due modi)?
Grazie a tutti coloro che hanno risposto finora. Praticamente tutte le risposte potrebbero essere accettate, ma sono andato con quello con il maggior numero di voti. – gspr