计算哈斯克尔中的下一个素数



我正在尝试计算与 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

我遇到的问题是我在运行时收到此错误:* 异常:"<<"循环">>"

不知道怎么了,是无限循环吗?

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

n = n + 1

因为这会改变 n 的值。在 Haskell 中,n 是一个名称,它始终引用使用它的函数中的相同值。如果n3开头,n将始终3。你可以做到,

next = n + 1

然后也改变

| otherwise = nextPrime n

| otherwise = nextPrime next

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

只需将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
  = ...

幸运的是,编译器能够检测到这种无限回归并警告您!

最新更新