Haskell - "缺乏附带的绑定"用于递归函数

时间:2015-01-20 18:48:25

标签: haskell

我有以下功能:

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

我注意到,当类型定义不正确时会出现这种类型的错误。但我无法弄清楚我的类型定义有什么问题,因为第一段摘录有效。

1 个答案:

答案 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