[英]Stack overflow in very simple code
我是一個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 xy == 0 | y <- [1..2]] == True = x
and [mod xy == 0 | y <- [1..2]] == True = x
而不是第一個后衛。 在這兩種情況下,我在嘗試運行時都會出現堆棧溢出。 我已經解決了這個問題,把所有東西放在主要加上一個列表理解,但我想知道這個有什么問題。 謝謝!
問題(或者至少是一個問題 - 我還沒有檢查過其他問題)就在這一行:
| otherwise = func x+1
你打算這樣做
| otherwise = func (x+1)
但它被解析為
| otherwise = (func x)+1
功能應用程序的優先級高於任何運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.