递归Haskell函数中的无限循环

Jul*_*lio 0 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
Run Code Online (Sandbox Code Playgroud)

dfe*_*uer 5

看来主要的问题是你定义了一个本地版本div:

div x y
  | x `mod` y == 0 = x `div` y
  | otherwise = x
Run Code Online (Sandbox Code Playgroud)

由于where子句(以及in let)中的绑定是递归的,div因此第一种情况的右侧指的是div您定义的相同内容!您可以使用其他名称来解决此问题,例如div':

div' x y
  | x `mod` y == 0 = x `div` y
  | otherwise = x
Run Code Online (Sandbox Code Playgroud)