1

在使用 Haskell 输入数字后,我试图计算下一个最接近的素数,我编写了 2 个函数isPrimenextPrime

这是我的代码:

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

我遇到的问题是当我运行它时出现此错误:*异常:“<<”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 回答
3

您不能更改 Haskell 中变量的值。这意味着您无法执行

n = n + 1

因为那会改变n. 在 Haskell 中,n是一个名称,它总是在它所使用的函数中引用相同的值。如果n开始时3n永远3。你可以这样做,

next = n + 1

然后也改变

| otherwise = nextPrime n

进入

| otherwise = nextPrime next

这不会改变任何变量的值,而是使用新值创建一个新变量——这是您在 Haskell 中经常做的事情!

于 2013-10-05T14:20:14.903 回答