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

时间:2017-05-21 12:32:59

标签: haskell exception ghci

我试图写一个Erasthosthenes功能的筛子,给用户所有Primes从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

代码编译并给我正确的解决方案,但我在解决方案的最后得到了这个例外: ***例外:功能筛的非详尽模式 所以我已经检查了哪些模式没有匹配。

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 [] = [],所以我不明白 而且我认为_在Ha​​skell中意味着任何变量,那么模式()是什么意思? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

问题是您在两个单独的sieve语句中定义let 。因此,Haskell编译器认为您定义了两个单独的sieve函数。因此,第一个sieve缺少(_:_)模式,后一个[]模式。

如果您以后使用sieve,Haskell编译器将链接到最近的编译器,因此sieve中的后者(因此调用let primes = sieve [2..g])将只知道第二个 sieve定义(因此会在列表末尾出错)。

您可以使用以下let声明解决此问题:

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