我是一个Haskell新手,所以我可能会遗漏一些基本的东西 - 在这种情况下道歉,但我不知道下面的代码有什么问题以及为什么它会溢出堆栈。这是为了找到可以被[1..x]中的所有数字整除的最小数字,这里使用[1,2](Project Euler Problem 5用于[1..20])。
module Main where
main::IO()
main = do
putStrLn $ show s where s = func 1
func :: Int -> Int
func x
| foldr1 (&&) [x `mod` y == 0 | y <- [1..2]] == True = x
| otherwise = func x+1
我想它应该打印出'2'。
我也尝试使用and [mod x y == 0 | y <- [1..2]] == True = x
代替第一名后卫。在这两种情况下,我在尝试运行时都会出现堆栈溢出。
我已经解决了这个问题,把所有东西放在主要加上一个列表理解,但我想知道这个有什么问题。谢谢!
答案 0 :(得分:14)
问题(或者至少是一个问题 - 我还没有检查过其他问题)就在这一行:
| otherwise = func x+1
你打算这是
| otherwise = func (x+1)
但它被解析为
| otherwise = (func x)+1
功能应用程序的优先级高于任何操作员。