我是Haskell的新手,我在功能签名和类型方面遇到了一些麻烦。这是我的问题:
我正在尝试制作一个列表,其中包含1到999之间的每个数字,可以用它自己的数字的每个数字来划分。例如,数字280可以在该列表中,因为2 + 8 + 0 = 10和280/10 = 28 ...另一方面123不能因为1 + 2 + 3 = 6和123/6 = 20, 5。当最后一个操作给你一个带小数的数字时,它永远不会出现在那个列表中。
这是我的代码:
let inaHelper x = (floor(x)`mod`10)+ (floor(x/10)`mod`10)+(floor(x/100)`mod`10)
这第一部分只会对数字的每个数字求和。 这一部分有效......
这是最后一部分:
let ina = [x | x <- [1..999] , x `mod` (inaHelper x) == 0 ]
最后一部分应该做清单和验证,如果它可以在列表上。但它给出了这个错误:
No instance for (Integral t0) arising from a use of ‘it’
The type variable ‘t0’ is ambiguous
Note: there are several potential instances:
instance Integral Integer -- Defined in ‘GHC.Real’
instance Integral Int -- Defined in ‘GHC.Real’
instance Integral Word -- Defined in ‘GHC.Real’
In the first argument of ‘print’, namely ‘it’
In a stmt of an interactive GHCi command: print it
...
答案 0 :(得分:1)
ina = [x | x <- [1..999] , x `mod` (inaHelper x) == 0 ]
x
的类型是什么? Integer
? Int
? Word
?上面的代码非常通用,适用于任何整数类型。如果我们尝试打印它的类型我们
得到这样的东西
> :t ina
ina :: (Integral t, ...) => [t]
意味着结果是我们想要的任何类型t
的列表,前提是t
是一个整数类型(以及一些其他约束)。
当我们要求GHCi打印结果时,GHCi需要选择x
的类型,但无法明确决定。这就是错误消息所说的内容。
尝试在打印结果时指定类型。 E.g。
> ina :: [Int]
这将使GHCi选择t
类型为Int
,消除歧义。