I'm trying to make a simple function to return a centered string of text in Haskell, but I'm having trouble just finding how much padding to insert either side. I have this:
center padLength string = round ((padLength - (length string)) / 2)
Which gives the following error:
No instance for (Fractional Int)
arising from a use of '/'
Possible fix: add an instance declaration for (Fractional Int)
In the first argument of 'round', namely
'((padLength - (length string)) / 2)'
In the expression: round ((padLength - (length string)) / 2)
In an equation for `center':
center padLength string = round ((padLength - (length string)) / 2)
How can I (basically) convert from an Double (I think) to an Int?
And since Haskell is not object-oriented, there is no inheritance relationship that required any cast. There simply aren't meaningless object values that needed runtime-checking/casting. For expressing alternatives, you'll have to define a union type, a typeclass or use the Either type.
The workhorse for converting from integral types is fromIntegral , which will convert from any Integral type into any Num eric type (which includes Int , Integer , Rational , and Double ): fromIntegral :: (Num b, Integral a) => a -> b.
What's the difference between Integer and Int ? Integer can represent arbitrarily large integers, up to using all of the storage on your machine. Int can only represent integers in a finite range.
The problem is not that you can't convert a Double to an Int — round
accomplishes that just fine — it's that you're trying to do division on an Int (padLength - length string
). The error message is just telling you that Int is not an instance of Fractional
, the typeclass for numbers that can be divided.
In general, you could use fromIntegral (padLength - length string)
to turn it into a Double, but in this case, you can simply use integer division directly:
center padLength string = padLength - (length string) `div` 2
a `div` b
is just a nicer way of writing div a b
; you can use any function as a binary operator like this.
You're trying to use fractional division /
on operands of integral type, but that's not defined.
You should either convert the operands to Double before dividing (using fromIntegral
), or use integral division div
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With