
I don't see a much better way than using something like Newton- Raphson and testing for some kind of convergence. The Fractional class can contain many things; for instance it contains rational numbers. So your mysqrt function would have to be able to cope with returning arbitrary precision results. As a first step you should specify what mysqrt should return when it can't return the exact result. For instance, what would you like mysqrt (2%1) to return? -- Lennart On Jan 18, 2007, at 18:15 , Novák Zoltán wrote:
Hello,
I would like to use the sqrt function on Fractional numbers. (mysqrt :: (Fractional a) => a->a)
Half of the problem is solved by:
Prelude> :t (realToFrac.sqrt) (realToFrac.sqrt) :: (Fractional b, Real a, Floating a) => a -> b
For the other half I tried:
Prelude> :t (realToFrac.sqrt.realToFrac) (realToFrac.sqrt.realToFrac) :: (Fractional b, Real a) => a -> b
Prelude> :t (realToFrac.sqrt.fromRational.toRational) (realToFrac.sqrt.fromRational.toRational) :: (Fractional b, Real a) => a -> b
Prelude> :t (realToFrac.sqrt.realToFrac.fromRational.toRational) (realToFrac.sqrt.realToFrac.fromRational.toRational) :: (Fractional b, Real a) => a -> b
I have to admit that I do not fully understand the Haskell numerical tower... Now I'm using the Newton method:
mysqrt :: (Fractional a) => a -> a mysqrt x = (iterate (\y -> (x / y + y) / 2.0 ) 1.0) !!2000
But I want a faster solution. (Not by replacing 2000 with 100... :)
Zoltan
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe