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?
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 ab
; 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
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.