7

私は Haskell の初心者なので、基本的なものが欠けている可能性があります。その場合は申し訳ありませんが、次のコードの何が問題なのか、スタックをオーバーフローさせる理由がわかりません。ここでは [1,2] を使用して、[1..x] のすべての数値で割り切れる最小の数値を見つけるためのものです (プロジェクト オイラー問題 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最初のガード代わりに使ってみました。どちらの場合も、これを実行しようとするとスタック オーバーフローが発生します。すべてをメインに加えてもう 1 つのリスト内包表記にすることで問題を解決しましたが、これの何が問題なのかを理解したいと思います。ありがとう!

4

1 に答える 1

14

問題(または少なくとも問題---私は他の人をチェックしていません)は次の行にあります:

| otherwise = func x+1

あなたはこれを意図しています

| otherwise = func (x+1)

しかし、それは次のように解析されます

| otherwise = (func x)+1

関数適用は、どの演算子よりも優先されます。

于 2012-11-21T09:10:00.637 に答える