递归Haskell函数中的无限循环

时间:2015-02-09 20:26:06

标签: haskell

嗯...为什么在评估任何整数时,此函数以无限循环结束> 3?

smallestMultiple n = factors [2..n] where
factors [] = []
factors (h:xs) = h:(factors $ filter ((<)1) [div x h|x<-xs])
    where
      div x y
          |x `mod` y ==0 = x `div` y
          |otherwise = x

1 个答案:

答案 0 :(得分:5)

主要问题似乎是您定义了div的本地版本:

div x y
  | x `mod` y == 0 = x `div` y
  | otherwise = x

由于where子句(以及let)中的绑定是递归的,因此第一个案例右侧的div引用相同的div你正在定义!您可以使用其他名称来解决此问题,例如div'

div' x y
  | x `mod` y == 0 = x `div` y
  | otherwise = x