2016-10-08 109 views
-3

我在嘗試創建foldr示例,該示例將Integral轉換爲數字列表(即[Int])。對Haskell數字類型感到困惑

pickDigit num pos = (num `div` (10^pos)) `mod` 10 

toDigits num = foldr (\pos acc -> (pickDigit num pos):acc) [] [0 .. floor (logBase 10 num)] 

成功加載。但是,當我嘗試運行它時,例如

> toDigits 1234 

我收到類型錯誤消息,我不明白。

當我向Haskell詢問加載代碼的類型並在源文件中明確包含這些類型時,我會在加載時收到錯誤消息。當我嘗試明確限制類型爲IntegerInt時,我收到更多錯誤消息。

我很感激一些建議。謝謝。

+5

請還發布錯誤消息。 –

回答

1

logBase需要浮動,但它不是

這工作:

[0 .. floor (logBase 10 $ fromIntegral num)] 
+0

謝謝。有用。但是爲什麼代碼加載時不會出現這個問題?如果源代碼中沒有聲明,代碼將會正常加載。然後':toDigits' - >'toDigits ::(RealFrac a,Integral a,Floating a)=> a - > [a]' – RussAbbott

+1

因爲沒有具體類型。它會加載,因爲對於一些假設類型'a',它是'Integral'和'RealFrac',這個函數將起作用。 –

+0

除了Alexander的評論,你可以用'1234'作爲參數調用該函數,該類型的參數類型爲'Num a => a',其中'a'可以是具有'Integral'和'RealFrac實例的假設類型'。 – chepner