我有以下功能:
tempFunc :: Int-> Int-> Int
tempFunc x y
| y == 0 = 0
| x `mod` y == 0 = y + tempFunc x (y-1)
| otherwise = y-1
其目的是递归地将一个数字的所有因子相加。我想消除对第二个参数y
的需求(因为y
等于x
),所以我按以下方式实现了该函数
tempFunc :: Int-> Int-> Int
sumFactor num = tempFunc num num
where
tempFunc x y
...
但是我收到以下错误:
The type signature for ‘tempFunc’ lacks an accompanying binding
我注意到,当类型定义不正确时会出现这种类型的错误。但我无法弄清楚我的类型定义有什么问题,因为第一段摘录有效。
答案 0 :(得分:11)
函数的类型签名必须与函数本身在同一范围内。如果要为where
子句中的函数添加类型签名(通常没有这样做,但有时有意义),你必须将它放在where
子句中:
sumFactor num = tempFunc num num
where
tempFunc :: Int-> Int-> Int
tempFunc x y
| y == 0 = 0
| x `mod` y == 0 = y + tempFunc x (y-1)
| otherwise = y-1