在Haskell中计算下一个素数

时间:2013-10-05 14:15:08

标签: function loops testing haskell recursion

我正在尝试使用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

我遇到的问题是我在运行时遇到此错误: * 异常:&#34;&lt;&lt;&#34;循环&#34;&gt;&gt;&# 34;

我不知道什么是错的,是无限循环吗?

2 个答案:

答案 0 :(得分:3)

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

n = n + 1

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

next = n + 1

然后也改变

| otherwise = nextPrime n

| otherwise = nextPrime next

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

答案 1 :(得分: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
  = ...

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