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

Non-exhaustive patterns in function defined in GHCi

提问人:J.Tmr 提问时间:5/21/2017 最后编辑:Jason AllerJ.Tmr 更新时间:11/17/2023 访问量:911

问:

我正在尝试编写一个 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

代码编译并给了我正确的解决方案,但我在解决方案的末尾收到此异常:

例外:功能筛中的非穷举模式

所以我检查了哪些模式不匹配。

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: []

我不明白,因为我已经给出了 并且我认为 Haskell 中的 _ 意味着任何变量,那么模式是什么意思? 任何帮助将不胜感激。let sieve [] = [](_:_)

Haskell 异常 GHCI

评论

0赞 Carcigenicate 5/21/2017
如果您将它们编写为 main 之外的函数,它会这样做吗?
0赞 amalloy 5/22/2017
GHCi 中函数中非穷举模式的可能重复

答:

6赞 willeM_ Van Onsem 5/21/2017 #1

问题在于您在两个单独的 let 语句中定义 sieve。因此,Haskell 编译器认为您定义了两个单独的筛分函数。因此,前者缺乏模式,后者缺乏模式。sieve(_:_)[]

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

您可以使用以下语句解决此问题:let

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

评论

1赞 Davislor 5/21/2017
您还可以将定义的两个部分缩进到相同的级别。let