5

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?

2 Answers 2

9

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Why does it need the `? I'm a bit new to Haskell
1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.