嗯...为什么在评估任何大于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)
看来主要的问题是你定义了一个本地版本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)