7

我是 Haskell 新手,所以我可能遗漏了一些基本的东西——在这种情况下很抱歉,但我就是不知道下面的代码有什么问题以及为什么它会溢出堆栈。它用于找到可以被 [1..x] 中的所有数字整除的最小数字,这里使用 [1,2](欧拉计划问题 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而不是第一后卫。在这两种情况下,我在尝试运行它时都会遇到堆栈溢出。我已经通过将所有内容放在 main 中加上另外一个列表理解来解决了这个问题,但我想了解这个有什么问题。谢谢!

4

1 回答 1

14

问题(或者至少是一个问题——我没有检查过其他问题)在这一行:

| otherwise = func x+1

你打算这样

| otherwise = func (x+1)

但它被解析为

| otherwise = (func x)+1

函数应用程序的优先级高于任何运算符。

于 2012-11-21T09:10:00.637 回答