2011-12-18 76 views
5

我想做一個簡單的函數來在Haskell中返回一個居中的字符串文本,但我遇到麻煩只是找到多少填充插入任何一方。我有這樣的: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) 

我怎麼能(主要)由雙(我認爲)爲int轉換?

回答

9

問題不在於你無法將Double轉換爲Int - round完成這一切很好 - 這是你試圖對Int進行除法(padLength - length string)。該錯誤消息只是告訴你,Int不是Fractional的一個實例,它是可以分割的數字的類型類。

在一般情況下,你可以使用fromIntegral (padLength - length string)把它變成一個雙,但在這種情況下,你可以簡單地直接使用整數除法:

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

a `div` b只是寫div a b的更好的方式;你可以使用任何函數作爲這樣的二元運算符。

+0

爲什麼需要'?我對Haskell有點新奇 –

+1

我已經將這些信息添加到我的回答:) – ehird

1

您試圖在整數類型的操作數上使用小數部分/,但沒有定義。

您應該在除法之前將操作數轉換爲Double(使用fromIntegral),或者使用積分除法div