round returns an Integral type, but sqrt expects a Floating type

Prelude> :t sqrt
sqrt :: (Floating a) => a -> a
Prelude> :t round
round :: (RealFrac a, Integral b) => a -> b
Prelude>

Haskell's numeric type classes can be intimidating for beginners, but it basically means you are combining floating point numbers with integer numbers, and you must convert these numbers to the same type (just as in C# or other languages, so that are aware of possible unwanted numerical effects).

You can use functions like fromIntegral and realToFrac to convert numbers.

So try this

thing n = n + fromIntegral ( round(sqrt n) )

You can also get rid of the parentheses like this:

thing n = n + fromIntegral $ round $ sqrt n


On Thu, Mar 26, 2009 at 11:01 PM, Ivan Moore <ivan.r.moore@gmail.com> wrote:
Hi all,

consider this very small function:

thing n = n + round(sqrt n)

It loads into ghci with no warnings. When I try to run "thing 10" I get:

*Main> :load c:\temp\statictype.hs
[1 of 1] Compiling Main             ( C:\temp\statictype.hs, interpreted )
Ok, modules loaded: Main.
*Main> thing 10

<interactive>:1:0:
   Ambiguous type variable `t' in the constraints:
     `Integral t' arising from a use of `thing' at <interactive>:1:0-7
     `RealFrac t' arising from a use of `thing' at <interactive>:1:0-7
     `Floating t' arising from a use of `thing' at <interactive>:1:0-7
   Probable fix: add a type signature that fixes these type variable(s)

I have tried to add various type signatures (without really knowing
what I'm doing!) and haven't been able to get it to work.

I am confused about a few things related to this:
(a) what type signature fixes it and why it needs any help - it looks
like the sort of thing that type inference shouldn't need any help
with
(b) it looks like a runtime type error and I thought you didn't get
runtime type errors in Haskell
(c) if I substitute 10 for n and do "10 + round(sqrt 10)" I get the
expected answer 13

any help most welcome.

cheers,

Ivan
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners