我试图写一个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 [] = []
,所以我不明白
而且我认为_在Haskell中意味着任何变量,那么模式(:)是什么意思?
任何帮助将不胜感激。
答案 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] }