我相信你想寫filter
與一個做記號。您只需在filter ls indx =
之後添加do
即可。但是,此代碼是純(即非一元),我會推薦這句法:
primeSieve :: Int -> [Int] -- Returns a list of primes up to upperbound
primeSieve upperbound = filter [2..upperbound]
where
filter ls indx =
let divisor = (ls!!indx)
filtered = [x | x <- ls, x `mod` divisor /= 0]
in if divisor*divisor >= last filtered
then filtered
else filter filtered (indx+1)
...但你的代碼給了我以下錯誤:
<file>:13:25:
Couldn't match expected type `[Int]'
with actual type `Int -> [Int]'
Probable cause: `filter' is applied to too few arguments
In the expression: filter [2 .. upperbound]
In an equation for `primeSieve':
primeSieve upperbound
= filter [2 .. upperbound]
where
filter ls indx
= let ...
in
if divisor * divisor >= last filtered then
filtered
else
filter filtered (indx + 1)
Failed, modules loaded: none.
我覺得你的意思傳遞0
作爲第二個參數filter
:
primeSieve :: Int -> [Int] -- Returns a list of primes up to upperbound
primeSieve upperbound = filter [2..upperbound]
where
filter ls indx =
let divisor = (ls!!indx)
filtered = [x | x <- ls, x `mod` divisor /= 0]
in if divisor*divisor >= last filtered
then filtered
else filter filtered (indx+1)
什麼是「中如果」的意思? –
這只是一個'let ... in'子句,後跟一個'if'表達式。這裏沒什麼魔法。 – baxbaxwalanuksiwe