【发布时间】:2016-12-05 19:01:26
【问题描述】:
我的 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 的定义上给了我一个错误,因为它说:无法将类型 'e' 与 NExpr 匹配''e' 是一个严格的类型变量,由 ... eval::... 预期 e 是实际的下一秒
ident = 字符串和 Nexpr:
data NExpr n = Const n |
Var Ident |
Plus (NExpr n) (NExpr n) |
Minus (NExpr n) (NExpr n) |
Times (NExpr n) (NExpr n)
如何解决?
【问题讨论】:
-
将实例更改为
instance (Num a, Ord a) => Evaluable NExpr where ... -
然后它说:期望 Nexpr 再有一个参数 Evaluable 的第一个参数应该有种类 * 但有种类 * -> * @Alec
标签: haskell pattern-matching monads