2016-08-21 64 views
0

我有以下代碼,它實現了篩或埃拉託塞尼:Haskell中:解析錯誤在嵌套where子句

primeSieve :: Int -> [Int] -- Returns a list of primes up to upperbound 
primeSieve upperbound = filter[2..upperbound] 
    where filter ls indx = 
    let divisor = (ls!!indx) 
    let filtered = [x | x <- ls, x `mod` divisor /= 0] 
    if divisor*divisor >= last filtered 
     then filtered 
     else filter filtered (indx+1) 

我獲得第4行,「不正確可能壓痕或不匹配的括號」解析錯誤。

這是爲什麼?

回答

1

的問題是filter的定義比它建議立即進行刪除是什麼小的壓痕。最重要的部分是

where filter ls indx = 
    let divisor = (ls!!indx) 

其中let開始的filter上面的行之前的4個字符。這會觸發語法錯誤。要解決它,你可以縮進更多filter定義

where filter ls indx = 
     let divisor = (ls!!indx) 

更常見的格式是

where 
    filter ls indx = 
    let divisor = (ls!!indx) 

因爲這樣你不縮進太多。

您可以找到有關在haskell wiki壓痕其中包含有關這種錯誤的一些不錯的視覺示例的詳細信息。

2

我相信你想寫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) 
+0

什麼是「中如果」的意思? –

+1

這只是一個'let ... in'子句,後跟一個'if'表達式。這裏沒什麼魔法。 – baxbaxwalanuksiwe