2014-04-01 53 views
2

我的代碼是這樣的:實例聲明哈斯克爾

type Code = [Inst] 

data Inst = PUSH Int 
      | PUSHV Name 
      | POP Name 
      | DO Op 
      | JUMP Label 
      | JUMPZ Label 
      | LABEL Label 
      deriving Show 

doJump :: Inst -> Code -> Code 
doJump l c = case (elemIndex l c) of 
       Just n -> drop (n+1) c 
       Nothing -> c 

而且GHC返回我這個錯誤,這讓我完全難倒... 我試圖做的是從後點返回列表發生特定元素。

No instance for (Eq Inst) arising from a use of `elemIndex' 
Possible fix: add an instance declaration for (Eq Inst) 
In the expression: (elemIndex l c) 
In the expression: 
    case (elemIndex l c) of { 
    Just n -> drop (n + 1) c 
    Nothing -> c } 
In an equation for `doJump': 
    doJump l c 
     = case (elemIndex l c) of { 
      Just n -> drop (n + 1) c 
      Nothing -> c } 

任何想法?

+0

不要在Haskell使用標籤。他們沒有顯着的縮進工作。 – rightfold

+2

@rightfold反對在Haskell中使用標籤,但[這不是其中之一](http://dmwit.com/tabs)。 –

回答

5

elemIndex要求列表中的元素是相等的,因此您需要爲Eq Inst添加實例。

使用deriving Eq,系統將自動生成的,例如:

data Inst = PUSH Int 
      | PUSHV Name 
      | POP Name 
      | DO Op 
      | JUMP Label 
      | JUMPZ Label 
      | LABEL Label 
      deriving (Show, Eq) 
+0

神奇,工作感謝。是否可以爲該功能添加一個Eq Inst實例。或者我必須爲整個數據類型做? – stell1315

+0

@ stell1315實例在Haskell中總是程序全局的。 –

+0

@ stell1315如果您不想將'Eq'派生到'Inst',可以使用'findIndex'而不是'elemIndex'。 –