[Haskell-beginners] Defaulting the following constraint ....

Alan Buxton alanbuxton
Thu Oct 3 17:52:43 UTC 2013


Thanks for the help. I now have another question related to this.

 

When I write:

 

isInt :: Double -> Bool

isInt x = x == fromInteger (floor x)

 

niceShow :: Double -> String

niceShow x = if isInt x then show (floor x :: Int) else show x

 

I get a warning about a "too strict if". If I then follow the recommendation
and change niceShow to be

 

show (if isInt x then (floor x :: Int) else x)

 

Then I get an error that Couldn't match expected type `Int' with actual type
`Double'   which makes sense because floor x :: Int produces an Int but x
alone is a Double. Surely hlint could have figured this out from the type
signatures and not made the recommendation to change my if structure?

 

What's going on here? And what best to do? What is a "too strict if" anyway?

 

a

 

 

From: Beginners [mailto:beginners-bounces at haskell.org] On Behalf Of David
McBride
Sent: 30 September 2013 21:54
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell
Subject: Re: [Haskell-beginners] Defaulting the following constraint ....

 

It is because you do a floor on x, returning a where a is an Integral, but
which Integral is it?  Is it an Int or an Integer?  Well it decides to
default it to integer because that is what ghci does as it is the safe
option, but it decided to warn you about it just so you are aware.  Afterall
integers are slower than ints, and you might have wanted an int.  You can
silence the warning by telling it what to do:

niceShow x = if (isInt x) then show (floor x :: Int) else show x
niceShow x = if (isInt x) then show (floor x :: Integer) else show x

 

On Mon, Sep 30, 2013 at 4:06 PM, Alan Buxton <alanbuxton at gmail.com> wrote:

Hi

 

I have something like this - purpose is that I need to drop redundant .0 in
a whole number - so to show 1.2345 as 1.2345 and to show 1.0 as 1

 

module Test where

 

niceShow x = if (isInt x) then show (floor x) else show x

 

isInt x = x == fromInteger (floor x)

But the hlint in my vim plugin keeps warning me that

 

test.hs|3 col 38 warning| Defaulting the following constraint(s) to type
`Integer'

||            (Integral a0) arising from a use of `floor' at
/tmp/test.hs:3:38-42

||            (Show a0) arising from a use of `show' at /tmp/test.hs:3:32-35

|| In the first argument of `show', namely `(floor x)'

|| In the expression: show (floor x)

|| In the expression: if (isInt x) then show (floor x) else show x

 

What does this mean? And what would I need to do in order to prevent this
warning?


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

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20131003/7664d0f0/attachment.html>



More information about the Beginners mailing list