
Add one more constraint that a is member of Floating type class and change your + to ++ " " + show(pi * x * x showAreaOfCircle :: (Floating a, Show a) => a -> String showAreaOfCircle x = "The area of a circle with radius" ++ show x ++ "is about" ++ " " ++ show (pi * x * x) ++ "cm^2" *Tmp> showAreaOfCircle 10 "The area of a circle with radius10.0is about 314.1592653589793cm^2" *Tmp> :t showAreaOfCircle 10 showAreaOfCircle 10 :: String *Tmp> :t showAreaOfCircle showAreaOfCircle :: (Show a, Floating a) => a -> String *Tmp> :t showAreaOfCircle 10.12 showAreaOfCircle 10.12 :: String *Tmp> showAreaOfCircle 10.12 "The area of a circle with radius10.12is about 321.74432666180644cm^2" *Tmp> Best, Mukesh On Wed, Apr 4, 2018 at 4:37 PM, 清羽 <1625143974@qq.com> wrote:
here is the question:
Write a function showAreaOfCircle which, given the radius of a circle, calculates the area of the circle,
<code>showAreaOfCircle 12.3</code> ⇒ <code>"The area of a circle with radius 12.3cm is about 475.2915525615999 cm^2"</code>
my solution is:
showAreaOfCircle :: Show a => a -> String showAreaOfCircle x = "The area of a circle with radius" ++ show x ++ "is about" ++ " " + show(pi * x * x) ++ "cm^2"
but there is an error
• Could not deduce (Num a) arising from a use of ‘*’ from the context: Show a bound by the type signature for: showAreaOfCircle :: forall a. Show a => a -> String at FirstStep.hs:20:1-41 Possible fix: add (Num a) to the context of the type signature for: showAreaOfCircle :: forall a. Show a => a -> String • In the first argument of ‘show’, namely ‘(pi * x * x)’ In the second argument of ‘(+)’, namely ‘show (pi * x * x)’ In the second argument of ‘(++)’, namely ‘" " + show (pi * x * x)’
I had tried to change the type declaration to
Show a => Num a => a -> String
i guess there must be a problem with pi.
Can someone help me with the error message? Great thanks
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners