2016-12-05 82 views
-2

我有我的Haskell代碼的信息:哈斯克爾:剛性類型變量的錯誤

data Symtable a = General a | Stack a 

class Evaluable e where 
eval :: (Num a, Ord a) => (Ident -> Maybe a) -> (e a) -> (Either String a) 
typeCheck :: (Ident -> String) -> (e a) -> Bool 

instance (Num a, Ord a) => Evaluable (NExpr a) where 
eval _ (Const n) = Right n 
typeCheck f f2 = True --to make the code compilable 

因爲它說,它給了我在Eval定義的錯誤:無法NExpr匹配型「E」」 'E' 是......的eval :: ...預計EA實際Nexpr一個

的ident =字符串和Nexpr約束剛性類型變量:

data NExpr n = Const n | 
      Var Ident | 
      Plus (NExpr n) (NExpr n) | 
      Minus (NExpr n) (NExpr n) | 
      Times (NExpr n) (NExpr n) 

如何解決呢?

+1

將實例更改爲'instance(Num a,Ord a)=>可評估的NExpr,其中...... – Alec

+0

然後它說: 期待Nexpr的第一個參數應該有kind * * kind * - > * @Alec –

回答

4

如果您提供的代碼塊確實與您在文件中的內容完全相同,那麼您的縮進是錯誤的。

type Ident = String 

data NExpr n = Const n | 
      Var Ident | 
      Plus (NExpr n) (NExpr n) | 
      Minus (NExpr n) (NExpr n) | 
      Times (NExpr n) (NExpr n) 

data Symtable a = General a | Stack a 

class Evaluable e where 
    eval :: (Num a, Ord a) => (Ident -> Maybe a) -> e a -> Either String a 
    typeCheck :: (Ident -> String) -> e a -> Bool 

instance Evaluable NExpr where 
    eval _ (Const n) = Right n 
    typeCheck f f2 = True --to make the code compilable 

注意where後的定義需要縮進:固定壓痕,並按照亞歷克的有關實例定義,這種類型的檢查提示後。

你寫它的方式,您所定義的任何類或實例以外的方法:

eval :: (Num a, Ord a) => (Ident -> Maybe a) -> e a -> Either String a 
eval _ (Const n) = Right n 

但在這種情況下eval的類型指定,它必須爲所有e a,不能定義僅適用於NExpr a

+0

這是一個縮進問題 –