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

Haskell GHCi中定义的函数中的非穷举模式,haskell,exception,ghci,Haskell,Exception,Ghci,我正在尝试编写一个ErasThostenes筛选函数,它为用户提供从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 我不明白,因为我已经给出了let sieve[]=

我正在尝试编写一个ErasThostenes筛选函数,它为用户提供从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
我不明白,因为我已经给出了
let sieve[]=[]
我想,在Haskell中,uu意味着任何变量,那么模式(:)意味着什么呢?
任何帮助都将不胜感激。

问题在于您在两个独立的
let
语句中定义
sieve
。因此,Haskell编译器认为您定义了两个独立的
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] }

让{sieve[]=[];sieve(p:xs)=p:sieve[x | x如果您将它们作为main之外的函数编写,它会这样做吗?可能的副本您还可以在
之后将定义的两部分缩进到相同的级别。
let { sieve [] = [] ; sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0] }