J'écris une classe Separate
qui effectue certaines opérations indépendamment sur des "parties" de différentes structures; par exemple. les parties réelles et complexes d'un nombre complexe (plus tard, j'en aurai aussi besoin pour les listes). De cette façon, je peux écrire des fonctions qui ne se soucient pas de la structure sur laquelle elles agissent mais qui le font de manière indépendante.Instance de complexe double
Les fonctions doivent fonctionner normalement sur des structures sans pièces, par ex. Double
. Ceci sera utilisé entre autres pour calculer les écarts-types (je sais qu'il existe un écart-type défini pour les nombres complexes qui donne un nombre réel mais que le nombre "indépendant" a plus de sens dans mon cas).
Mais j'ai des problèmes avec certaines déclarations d'instance. Dans un particulier des opérations devrait être « multiplier par un Double
», alias scale
:
class Separate a where
scale :: Double -> a -> a
instance Separate Double where
scale = (*)
instance (Floating a) => Separate (Complex a) where
d `scale` z = (*d) <$> z
Bien sûr, ne compile pas parce que *
n'est pas défini entre un Double
et un Floating a
général. Mais je ne peux pas définir directement instance Separate (Complex Double) where...
.
Je pourrais simplement écrire une fonction Double -> Complex Double -> Complex Double
sans classe, mais l'écart-type doit être défini séparément pour différentes structures.
Des idées?
utiliser juste FlexibleInstances. –