2012-11-21 105 views
7

我是一個Haskell新手,所以我可能會缺少一些基本的東西 - 在這種情況下,道歉,但我只是無法找出以下代碼有什麼問題以及爲什麼它溢出堆棧。它用於找出[1..x]中所有數字可等分的最小數字,這裏使用[1,2](歐拉項目爲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代替第一個後衛。在這兩種情況下,我都會在嘗試運行時遇到堆棧溢出。 我已經解決了這個問題,將所有東西都放在主要的位置上,再加上一個列表理解,但我想了解這個問題。謝謝!

+2

您可以省略'== True'。 – Franky

回答

14

的問題(或者至少是---我沒有檢查其他人的麻煩)是在這一行:

| otherwise = func x+1 

您打算這是

| otherwise = func (x+1) 

但解析爲

| otherwise = (func x)+1 

函數應用程序比任何運算符都具有更高的優先級。

+1

非常感謝,解決了它。從Python到Haskell,這是一條很滑的道路! –