在Haskell中的类型之间转换

时间:2011-12-18 20:49:55

标签: haskell types

我正在尝试创建一个简单的函数来在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 个答案:

答案 0 :(得分:9)

问题不在于你不能将Double转换为Int - round完成那么好 - 这就是你试图对Int(padLength - length string)进行除法。错误消息只是告诉您Int不是Fractional的实例,是可以划分的数字的类型类。

通常,您可以使用fromIntegral (padLength - length string)将其转换为Double,但在这种情况下,您可以直接使用整数除法:

center padLength string = padLength - (length string) `div` 2

a `div` b只是一种更好的写作方式div a b;你可以使用任何函数作为这样的二元运算符。

答案 1 :(得分:1)

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

您应该在分割之前将操作数转换为Double(使用fromIntegral),或使用积分div