在Haskell中转换数据类型

5

我正在尝试在Haskell中编写一个简单的函数,以返回居中的文本字符串,但我在确定要插入的填充量方面遇到了问题。 我有以下代码:

center padLength string = round ((padLength - (length string)) / 2)

这会导致以下错误:

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)

我如何将Double类型(我认为)转换为Int类型?

2个回答

9
问题不在于你无法将Double转换为Int — round可以很好地完成这一点 — 而是你试图对Int(padLength-length string)进行除法运算。错误信息只是告诉你Int不是Fractional的实例,而Fractional是可被除的数字类型类。
通常情况下,你可以使用fromIntegral(padLength-length string)将其转换为Double,但在这种情况下,你可以直接使用整数除法:
center padLength string = padLength - (length string) `div` 2

a `div` b只是更友好的写法,等同于div a b;你可以使用任意函数作为二元操作符来实现这一点。


为什么需要 `? 我对 Haskell 还不太熟悉。 - Dean Barnes

1

你试图在整数型操作数上使用小数除法/,但这是未定义的。

你应该在除法之前将操作数转换为Double类型(使用fromIntegral),或使用整数除法div


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接