1

Haskellで数値が入力された後、次に近い素数を計算しようとしています.2つの関数isPrimeをコーディングしました.nextPrime

これが私のコードです:

isPrime :: Int -> Bool
isPrime x   | x < 2          = False
        | otherwise      = prime (2:[3,4..(x-1)])
where 
    prime (y:z)
        | x < y ^ 2      = True
        | x `mod` y == 0 = False
        | otherwise      = prime z



nextPrime :: Int -> Int
nextPrime n | isPrime n == True = n
            | otherwise = nextPrime n
        where
            n = n + 1

私が抱えている問題は、実行時にこのエラーが発生することです: * Exception: "<<"loop">>"

よくわからないのですが、無限ループですか?

4

2 に答える 2

3

の定義をに変更するだけnextPrimeです

nextPrime :: Int -> Int
nextPrime n | isPrime n = n   -- don't need to compare to True here
            | otherwise = nextPrime (n+1)

n = n + 1を定義しようとすると、ランタイムがこれを次のように展開しようとするため、無限回帰が生成されます。

n =   n + 1
  =  (n + 1) + 1
  = ((n + 1) + 1) + 1
  = ...

幸いなことに、コンパイラはこの種の無限回帰を検出して警告することができます!

于 2013-10-05T14:20:49.410 に答える