Donc, j'ai une paire de typeclasses que je vais utiliser beaucoup ensemble, et je veux éviter de spécifier les deux à chaque fois. En fait, au lieu de mettreHaskell Typeclass raccourci
:: (Ord a, Fractional a, Ord b, Fractional b, ... Ord z, Fractional z) =>
au début de toutes mes spécifications de type, je préfère mettre
:: (OrdFractional a, OrdFractional b, ... OrdFractional z)
Alors, ma première idée sur la façon de le faire était de déclarer juste une nouvelle classe de types
module Example where
class (Fractional a, Ord a) => OrdFractional a
example :: (OrdFractional a, OrdFractional b) => (a,b) -> (a,b) -> (a,b) -> Bool
example (x1,y1) (x2,y2) (x3,y3) = (x1/x2 < x2/x3) && (y1/y2 < y2/y3)
Mais cela ne fonctionne pas aussi automagiquement que je voulais qu'elle:
% ghci
Prelude> :l Example.hs
Ok, modules loaded: Example.
Prelude Example> example (1::Float,3::Float) (2,2) (3,1)
<interactive>:1:0:
No instance for (OrdFractional Float)
arising from a use of `example' at <interactive>:1:0-39
Possible fix:
add an instance declaration for (OrdFractional Float)
In the expression: example (1 :: Float, 3 :: Float) (2, 2) (3, 1)
In the definition of `it':
it = example (1 :: Float, 3 :: Float) (2, 2) (3, 1)
Création manuelle des instances semble comme un glisser si, à côté, je pensais que je pourrais essayer de créer automatiquement des instances:
module Example where
class OrdFractional a
instance (Fractional a, Ord a) => OrdFractional a
example :: (OrdFractional a, OrdFractional b) => (a,b) -> (a,b) -> (a,b) -> Bool
example (x1,y1) (x2,y2) (x3,y3) = (x1/x2 < x2/x3) && (y1/y2 < y2/y3)
Mais le compilateur ne pas comme ça:
ghc -c Example.hs
Example.hs:4:0:
Illegal instance declaration for `OrdFractional a'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are type *variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `OrdFractional a'
Ainsi est il y a un moyen que je peux le faire?
La nouvelle extension ConstraintKinds devrait permettre des synonymes de contexte. –