
On 17/07/14 02:32, Niklas Haas wrote:
The reason you're getting this error is because all you know about your instance is that the type of fft is :: [Complex Double] -> [Complex Double].
Since by definition this [Complex Double] is ComplexSignalType sx, all we know about the associated instance (parametrized by sx) is that ComplexSignalType sx ~ [Complex Double]. Since ComplexSignalType is a type family, it's not injective, so this does not suffice to uniquely identify our actual instance (sx, here called s0 by GHC).
For example, we could have a second instance:
instance Complexable () where type ComplexSignalType () = [Complex Double]
instance FourierTransformable () where fft = error "oops"
And with this instance, fft would also be [Complex Double] -> [Complex Double] but the behavior of would clearly be different to your actually intended function.
If you think your signal function is bijective, you could use a two-way functional dependency like this:
class Complexable sx cx | sx -> cx, cx -> sx
class Complexable sx cx => FourierTransformable sx cx where fft :: cx -> cx
Or if you want to avoid the overhead of redesigning Complexable you could even do something like this:
class (cx ~ ComplexSignalType sx, Complexable sx) => FourierTransformable sx cx | cx -> sx where fft :: cx -> cx
Either way, if instance selection should be possible based solely on the type of ‘cx’, then ‘cx’ must imply everything contained in the instance head. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Thanks for the explanation, Niklas, now I understand (I'm understanding) type families and I left with: class (Signal s, ComplexSignal (ComplexSignalType s), RealSignalType (ComplexSignalType s) ~ s) ⇒ Complexable s where type ComplexSignalType s class (Complexable s) ⇒ FourierTransformable s where fft ⦂ ∀ csx. (csx ~ ComplexSignalType s, ComplexSignal csx) ⇒ csx → csx Maybe more complex than normal? Thanks again. -- Leza Morais Lutonda, Lemol-C http://lemol.github.io 50 Aniversario de la Cujae. Inaugurada por Fidel el 2 de diciembre de 1964 http://cujae.edu.cu