I think that an easier solution is to just change the type of
equilateralTri to:
equilateralTri :: Window -> Float -> Float -> Float -> IO()
But I am on the road and wasn't able to actually run the code.
-Paul
Dougal Stanton wrote:
On 27/06/07, Balu Raman <[EMAIL PROTECTED]> wrote:
equilateralTri :: Window -> Int -> Int -> Int -> IO()
equilateralTri w x y side
= drawInWindow w (withColor Red
(polygon
[(x,y),(a,b),(x,y)]))
where
b = y + side * sin(pi/3)
a = x + side * cos(pi/3)
Your problem lies in this section here. Let's look at the error message:
triangle.hs:17:36:
No instance for (Floating Int)
arising from use of 'pi' at triangle.hs:17:36-37
Probable fix: add an instance declaration for (Floating Int)
In the first argument of '(/)', namely 'pi'
In the first argument of 'cos', namely '(pi / 3)'
In the second argument of '(*)', namely 'cos (pi/3)'
Failed, modules loaded: none
The problem comes from the calculations of 'a' and 'b'. The function
sin doesn't return an Int value. It returns types within the type
class Floating (annotated as below, for some unspecified 'a').
sin (pi/3) :: Floating a => a
side :: Int
Since the type checker has one unknown type, a, and one known, Int, it
tries to put the two together. Then it finds that Int is not an
instance of the Floating class, so a /= Int. So it asks you to make
one:
Probable fix: add an instance declaration for (Floating Int)
In this case, the advice is bad. There is no reasonable way of making
a machine integer a member of the floating class. What you need to do
instead is ensure that you're using a type that is a member of the
Floating class - that is, convert from an Int before you start the
calculation.
The function fromIntegral should come in handy:
let n = 3 :: Int
(fromIntegral n) * sin (pi/3)
2.598076211353316
Good luck!
D.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe