简体   繁体   中英

Converting between types in Haskell

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM