2016-10-08 106 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