【发布时间】:2016-12-31 07:05:16
【问题描述】:
在学习 Haskell 时,我要做一个函数来返回给定数字的所有整数除数。因此,我使用两个嵌套的 where 子句创建了它,但它不起作用。
错误返回:exs2.hs:49:24: Parse error in pattern: negRef / 2
divisors' :: (Integral a) => a -> [a]
divisors' x = divs x (x/2) [x]
where
divs ref 1 list = negDiv (-ref) (-2) ((-1):1:list)
divs ref num list = if (mod ref num == 0) then divs ref (num-1) (num:list) else divs ref (num-1) list
where
negDiv negRef (negRef/2) negList = (negRef:(negRef/2):negList)
negDiv negRef negNum negList = if (mod negRef negNum == 0) then negDiv (negNum-1) (negNum:negList) else negDiv (negNum-1) negList
那有什么问题呢?它似乎缩进很好。
【问题讨论】:
-
negRef/2不是有效模式。 -
内部 where 子句仅适用于 div 定义中的第二行。当第一行 div 调用 negDiv 时,内部 where 子句不在作用域内。那和模式的事情。
-
那我怎样才能正确地写出这种划分模式呢? @MathematicalOrchid
-
@flamenquino 你不能;你需要使用保护:
negDiv x y negList | x == y/2 = (x:y:negList)其他情况被指定为额外的保护,因为模式x和y将匹配任何东西。
标签: haskell where-clause