
Well ick. It makes sense (not that I can do it yet but I understand what you are saying). I'll try both approaches since this is all about learning the language. I can throw in the "closeness" concept to norm as well. Without symbolic computation hitting an irrational value will take more time to get a numeric answer than I'm willing to spend. Thanks for pointing the way, -ljr Cale Gibbard wrote:
Note that you can't pattern match to make special cases for handling particular types, only against data constructors in the specific type which your function accepts as input.
You need a typeclass if you want to have a function which acts differently at different types. As you might have realised abs is somewhat ineffective for comparing the magnitudes of numbers which aren't already in Ord, as it will produce a value of the same type.
The main trouble here is that abs :: (Num a) => a -> a and doesn't help to order the complex numbers. On the other hand, there is magnitude :: (RealFloat a) => Complex a -> a which will take your Complex Double and give you back a Double, for instance, and Double will be ordered, which is exactly what you want.
The quickest way to solve this problem is to just make a typeclass for the Newton's method functions, and put them in it, and change the implementation for the Complex instance. You might also consider making a class for a general norm operation, but this would pretty much necessarily be a multiparameter typeclass, and you'd likely want to use functional dependencies, so that the result type would be determined by the input type.
hope this helps, - Cale
--
Lanny Ripple