2009-09-09 222 views
10

我還是個新手,試圖創建一個在函數中使用的列表,並希望儘可能保持它小到logBase x y。 但我無法將logBase放入我可以在此列表中使用的東西。Haskell將Float轉換爲Int

[1 ..(logBase x和y)]

任何建議?

回答

10

你不要張貼你得到了什麼類型的錯誤,但我想它是這樣的:

Prelude> let x = 2 
Prelude> let y = 7 
Prelude> [1 .. (logBase x y)] 

<interactive>:1:7: 
    No instance for (Floating Integer) 
     arising from a use of `logBase' at <interactive>:1:7-17 
    Possible fix: add an instance declaration for (Floating Integer) 
    In the expression: (logBase x y) 
    In the expression: [1 .. (logBase x y)] 
    In the definition of `it': it = [1 .. (logBase x y)] 

的問題是:

Prelude> :t logBase 
logBase :: (Floating a) => a -> a -> a 

返回浮動類的類型,而程序中的其他變量(1,'x','y')是整數類型的。

我想你想要一個整數序列?

Prelude> :set -XNoMonomorphismRestriction 
Prelude> let x = 2 
Prelude> let y = 42 
Prelude> [1 .. truncate (logBase x y)] 
[1,2,3,4,5] 

使用截斷,細胞或地板。

2

您可能想要某種舍入,截斷,平面或吊頂功能。 Ints和Floats是不同的類型(如你所見),編譯器不會讓你混合它們。我會在一分鐘內找到一個參考。

8

您可能需要其中一個功能列表hereHoogleHayoo!對於這類事情來說是很好的工具,因爲它們可以讓你放入你想要的函數的類型並獲取函數列表。使用Haskell豐富的類型系統,這可能是一個非常有用的工具,比動態類型語言甚至靜態類型語言(如C或Java)都要好。