2013-06-01 107 views
2

我正在寫一些Haskell代碼來學習語言,我已經運行到語法錯誤:Haskell語法錯誤where語句

Vec2.hs:33:27: parse error on input '='

我在這裏寫的代碼如下。該錯誤是在第二項中vec2NormalizeiLength = ...指着我看不出有語法錯誤

-- Get the inverse length of v and multiply the components by it 
-- Resulting in the normalized form of v 
vec2Normalize :: Vec2 -> Vec2 
vec2Normalize [email protected](x,y) = (x * iLength, y * iLength) 
    where length = vec2Length v 
      iLength = if length == 0 then 1 else (1/length) 
+0

這不是你粘貼的第33行。錯誤很可能在其他地方,並且只在第33行報告。不管第33行是什麼情況。 – Carl

+0

它是在它的文件的第33行,我只發佈相關部分。當我註釋掉這個函數時,錯誤消失了。 –

回答

7

由於您沒有提供完整的代碼,因此需要進行一些猜測,但是此錯誤可能表示您的行iLength = ...未正確縮進;實際上,iLength開始的就行了就行了。

您的原始文件是否使用製表符而不是空格用於縮進?如果是這樣,請注意,Haskell總是將選項卡解釋爲跨越8列。因此,例如,

<TAB>where length = ... 
<TAB><TAB><SPACE><SPACE>iLength = ... 

將被解釋爲

 where length = ... 
        iLength = ... 

從而使錯誤,即使你的編輯器可能顯示,如果它使用4列標籤正確對齊線。

+3

是的,代碼正在使用選項卡。您可以通過單擊問題上的「編輯」鏈接並嘗試選擇該行上的空格來進行判斷。它也將看起來就像你的第二個代碼塊。 – hammar

+0

@hammar:謝謝,我不知道。 – chirlu

4

你使用製表符縮進,所以where子句中的第二個定義實際上沒有與第一個對齊。 Haskell使用8個空格的製表符寬度,這可能與編輯器不同,導致出現如下代碼看起來沒問題,但事實並非如此。

我強烈建議您將編輯器配置爲僅在使用Haskell代碼時才使用空格。