2010-10-23 77 views
1

我剛開始學習Haskell,遇到了2-adic類型的問題。這裏的重要代碼:模式匹配中的衝突定義

data Rectangle = NoRect | Rect (Float,Float) (Float,Float) | Pane 
     deriving (Show) 
class Collision s1 s2 where 
     collides :: s1 -> s2 -> Bool 

instance (Collision Rectangle Rectangle) where 
    collides (Rect (aOrX, aOrY) (aCorX, aCorY)) 
      (Rect (bOrX,bOrY) (bCorX,bCorY)) = ... 
    collides Pane _ = True 
    ... 

編譯器(GHC 6.12.1)現在抱怨 Conflicting definitions for 'collides'

我不明白,怎麼定義會衝突,你呢?

謝謝!

+1

無法重現。當用false替換'...'並啓用MultiParamTypeClasses時,你的代碼對我來說編譯得很好。 – sepp2k 2010-10-23 12:57:09

+0

@ sepp2k,我做了完全相同的事情,並在1分鐘後發佈我的答案! – HaskellElephant 2010-10-23 12:59:31

+1

對我來說,它不但編譯好。除了'MultiParamTypeClasses'外還有其他標誌嗎?嘗試刪除'...'中的內容,並讓這些類型正常工作。 – Dario 2010-10-23 12:59:59

回答

3

最有可能的罪魁禍首是在您的「...」中的某個佈局錯誤導致兩個collides行被分成兩個單獨的塊。 Conflicting definitions for 'collides'表示同一範圍內有兩個不同的地方,即定義collides。不管怎樣,這兩行都會被中斷,所以編譯器將它們看作是單獨的,或者在「...」部分中有錯誤,以某種方式在一個範圍內定義collides兩次。

有兩種主要的方式可以跳出Conflicting definitions錯誤。首先,相同函數定義中的兩個綁定可以嘗試綁定相同的變量,如foo x x = ...中所述。這是不允許的,因爲它定義了兩次x

另一個(這是我懷疑在你的代碼中適用的那個)是當同一個定義的兩個部分被另一個定義「中斷」時。編譯器將其視爲兩個單獨的定義。例如:

foo True = ... 
bar = ... 
foo False = ... 

這不是或者被允許的,因爲它(再次)限定兩次相同的名稱(foo)。

中斷可能並不明顯,特別是在您意外混合了製表符和空格的情況下(並且您的編輯器使用Haskell假設的每個空間中的8個製表符以外的內容)。它可以在編輯器中出現在where子句中的縮進行,但由於製表符寬度的差異,編譯器會將其與foo對齊,從而使第二個foo成爲另一個與第一個衝突的定義。

在佈局敏感的語言中,通常認爲只使用代碼中的空格,或者至少要確保編輯器使用適當數量的空格作爲其製表符。對於Haskell,即8。

+0

謝謝!這有助於:) – zombiecalypse 2010-10-24 09:36:22