
On 6 Jan 2005, at 01:37, MaurĂcio wrote:
import Complex;
complex_root :: (Float, Float, Float) -> (Complex Float, Complex Float) complex_root (a,b,c) = (x1,x2) where { delta = b * b - 4 * a * c :: Float; sqr_delta = if delta >= 0 then (sqrt delta) :+ 0 else 0 :+ (sqrt delta) :: (Complex Float); x1 = (b + sqr_delta)/(2 * a); x2 = (b - sqr_delta)/(2 * a); }
Couldn't match `Float' against `Complex Float' Expected type: Float Inferred type: Complex Float In the second argument of `(+)', namely `sqr_delta' In the definition of `x1': x1 = (b + sqr_delta)
Can you help me finding what is wrong? Shouldn't "b" be converted to Complex Float and be summed to sqr_delta?
Haskell will not automatically convert b from Float to Complex Float. The arguments of (+) should have the same type. One alternative is to use b :+ 0 instead of b. (and similarly for a). Another approach is to define a 'cast' function like: toComplex x = (fromRational.toRational) x :: Complex Float and then you can use toComplex b instead of b :+ 0. that's more characters to type, though... Note that sqr_delta isn't going to be defined as you expect, either. Since delta has type Float, sqrt delta has type Float. (And sqrt -1 :: Float is Not A Number). If you want to do it by hand this way, then you want:
sqr_delta = if delta >= 0 then (sqrt delta) :+ 0 else 0 :+ (sqrt (-delta)) :: (Complex Float);
If delta was itself already Complex, then sqrt would do the right thing automatically. Jules