Supponiamo di voler rendere tutti i numeri un'istanza di Monoid
. Invece di dover creare un'istanza per ogni Num
come questo:Puoi creare un'istanza di una classe non per un tipo ma per un'intera classe in Haskell?
instance Monoid Int where
mappend = (+)
mempty = 0
instance Monoid Float where
mappend = (+)
mempty = 0.0
-- etc
C'è qualcosa di simile?
instance Num t => Monoid t where
mappend = (+)
mempty = 0
Modifica
Alcuni stanno rispondendo con le estensioni GHC ed avvertimento circa i potenziali problemi; Ho trovato quello informativo, ma penso che resterò con Sum
, Product
e qualunque cosa faccia lo coerce
.
quello che stai cercando è già lì - ma ci sono più di un Monoid possibile per i numeri - ecco perché è lì per 'Sum' e' Product' ([vedi Data.Monoid] (https: //hackage.haskell .org/package/base-4.8.1.0/docs/Data-Monoid.html # t: Monoid)) – Carsten
@Carsten Ora che so di 'Sum', posso farlo:' mconcat ([1,2] :: Sum Int) ', che è bello, ma non posso fare' mconcat ([1,2] :: Sum Float) ', né' mconcat ([1,2] :: Sum Fractional) '. Qual è il modo corretto di usare 'Sum' per' Float's e 'Double's? –
Non ho idea di come sia stato il primo a funzionare - ma 'mconcat ([1,2] :: [Sum Float])' funziona bene per me;) – Carsten