Por lo tanto, tengo un par de clases de tipos que usaré mucho, y quiero evitar especificar ambas cada vez. Básicamente, en lugar de ponerTaquigrafía de Haskell Typeclass
:: (Ord a, Fractional a, Ord b, Fractional b, ... Ord z, Fractional z) =>
al comienzo de todos mis especificaciones de tipo, prefiero poner
:: (OrdFractional a, OrdFractional b, ... OrdFractional z)
lo tanto, mi primera idea sobre cómo hacer esto fue declarar que una nueva clase de tipos
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)
Pero esto no funcionó como automagicamente como yo deseaba que lo haría:
% 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)
Creación manual de casos parece como un lastre por lo que, al lado, pensé que podría tratar de crear automáticamente instancias:
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)
Pero el compilador no lo hicieron así:
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'
Así es Hay una forma en que puedo hacer esto?
La nueva extensión ConstraintKinds debe permitir que los sinónimos de contexto. –