GHCi 中定义的功能的非详尽模式
Non-exhaustive patterns in function defined in GHCi
我正在尝试编写一个 Erasthosthenes 筛选函数,它为用户提供从 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 中的 _ 表示任何变量,那么模式 (:) 是什么意思?
任何帮助将不胜感激。
问题是您 在两个单独的 let
语句中定义 sieve
。结果,Haskell 编译器认为您定义了 两个独立的 sieve
函数 。因此第一个 sieve
缺少 (_:_)
模式,而后者缺少 []
模式。
如果您稍后使用 sieve
,Haskell 编译器将 link 到最接近的,因此后者(作为调用 sieve
的结果) let primes = sieve [2..g]
只会知道 second sieve
定义(因此会在列表末尾出错)。
您可以使用以下 let
语句解决此问题:
let { sieve [] = [] ; sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0] }
我正在尝试编写一个 Erasthosthenes 筛选函数,它为用户提供从 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 中的 _ 表示任何变量,那么模式 (:) 是什么意思?
任何帮助将不胜感激。
问题是您 在两个单独的 let
语句中定义 sieve
。结果,Haskell 编译器认为您定义了 两个独立的 sieve
函数 。因此第一个 sieve
缺少 (_:_)
模式,而后者缺少 []
模式。
如果您稍后使用 sieve
,Haskell 编译器将 link 到最接近的,因此后者(作为调用 sieve
的结果) let primes = sieve [2..g]
只会知道 second sieve
定义(因此会在列表末尾出错)。
您可以使用以下 let
语句解决此问题:
let { sieve [] = [] ; sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0] }