Existe-t-il un moyen de "lever" facilement une instance de classe dans Haskell?Occurrence de classe de levage dans Haskell
J'ai souvent besoin de créer, par exemple, les instances Num pour certaines classes qui sont tout simplement « levage » la structure Num par le constructeur de type comme ceci:
data SomeType a = SomeCons a
instance (Num a)=>Num SomeCons a where
(SomeCons x) + (SomeCons y) = SomeCons (x+y)
negate (SomeCons x) = SomeCons (negate x)
-- similarly for other functions.
Y at-il un moyen d'éviter ce passe-partout et "soulevez" cette structure Num automatiquement? J'ai l'habitude de le faire avec Show et d'autres classes aussi quand j'essayais d'apprendre des existences et le compilateur ne me laissait pas utiliser deriving(Show)
.
Hum ... Pourquoi cela fonctionne avec newtype mais pas avec les données? –
Étant donné qu'un newtype ne peut pas ajouter de constructeur ou de champ, il ne fait que réécrire un type existant. Cela garantit que l'extension peut fonctionner avec n'importe quelle classe, au lieu de seulement les classes que vous pouvez généralement obtenir pour n'importe quel type de données. – Martijn