我试图写一个筛选的Eratosthenes函数,给用户所有素数从2到他们的上限。所以我写了这段代码:
main = do
putStrLn "Upper Limit"
g <- readLn
let sieve [] = []
let sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0]
let primes = sieve [2..g]
print primes
字符串
代码编译并给出了正确的解决方案,但我在解决方案的末尾得到了这个异常:
例外:函数sieve中的非穷举模式
所以我查了哪些模式不匹配。
warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for `sieve': Patterns not matched: (_:_)
warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for `sieve': Patterns not matched: []
型
我不太明白,因为我给了let sieve [] = []
,我以为_在Haskell中是指任何变量,那么模式(_:_)
是什么意思呢?
1条答案
按热度按时间vwkv1x7d1#
问题是你在两个单独的
let
语句中定义了sieve
。结果Haskell编译器认为你定义了两个单独的sieve
函数。因此第一个sieve
缺少(_:_)
模式,而后者缺少[]
模式。如果您稍后使用
sieve
,Haskell编译器将链接到最接近的一个,因此let primes = sieve [2..g]
中的后者(结果是对sieve
的调用)将只知道 * 第二个 *sieve
定义(因此将在列表末尾出错)。你可以使用下面的
let
语句来解决这个问题:字符串