Haskell - 签名和类型错误

时间:2017-10-10 12:32:08

标签: haskell

我是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


...

1 个答案:

答案 0 :(得分:1)

ina = [x | x <- [1..999] , x `mod` (inaHelper x) == 0   ]

x的类型是什么? IntegerIntWord?上面的代码非常通用,适用于任何整数类型。如果我们尝试打印它的类型我们 得到这样的东西

> :t ina
ina :: (Integral t, ...) => [t]

意味着结果是我们想要的任何类型t的列表,前提是t是一个整数类型(以及一些其他约束)。

当我们要求GHCi打印结果时,GHCi需要选择x的类型,但无法明确决定。这就是错误消息所说的内容。

尝试在打印结果时指定类型。 E.g。

> ina :: [Int]

这将使GHCi选择t类型为Int,消除歧义。