我正在尝试使用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
我遇到的问题是我在运行时遇到此错误: * 异常:&#34;&lt;&lt;&#34;循环&#34;&gt;&gt;&# 34;
我不知道什么是错的,是无限循环吗?
答案 0 :(得分:3)
您无法更改Haskell中的变量值。这意味着您无法执行
n = n + 1
因为这会改变n
的值。在Haskell中,n
是始终在其使用的函数内引用相同值的名称。如果n
以3
开头,则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
= ...
幸运的是,编译器能够检测到这种无限回归并警告你!