haskell GHCi中定义的函数中的非穷举模式

shyt4zoc  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(112)

我试图写一个筛选的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中是指任何变量,那么模式(_:_)是什么意思呢?

vwkv1x7d

vwkv1x7d1#

问题是你在两个单独的let语句中定义了sieve。结果Haskell编译器认为你定义了两个单独的sieve函数。因此第一个sieve缺少(_:_)模式,而后者缺少[]模式。
如果您稍后使用sieve,Haskell编译器将链接到最接近的一个,因此let primes = sieve [2..g]中的后者(结果是对sieve的调用)将只知道 * 第二个 * sieve定义(因此将在列表末尾出错)。
你可以使用下面的let语句来解决这个问题:

let { sieve [] = [] ; sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0] }

字符串

相关问题