我正在开发一个可以计算表达式中使用的运算符数的函数。我的代码如下:
data Expr = Lit Int |
Expr :+: Expr |
Expr :-: Expr
size :: Expr -> Int
size (Lit n) = 0
size (e1 :+: e2) = 1 + (size e1) + (size e2)
size (e1 :-: e2) = 1 + (size e1) + (size e2)
但是当我尝试使用Hugs98执行此代码时,我收到以下错误:
Main> size 2+3
ERROR - Cannot infer instance
*** Instance : Num Expr
*** Expression : size 2 + 3
有人可以告诉我我做错了什么吗?我真的不在乎自己。
答案 0 :(得分:5)
2+3
不是有效的表达式。对于您的类型,使用Lit
数据构造函数创建原始值,有效运算符为:+:
和:-:
。所以你真正需要的是Lit 2 :+: Lit 3
。所以试试
size (Lit 2 :+: Lit 3)
答案 1 :(得分:0)
您可以将其设为Num实例:
instance Num Expr where
(+) = (:+:)
(-) = (:-:)
negate = (0 -)
fromInteger = Lit . fromInteger
(*) = error "not implemented"
abs = error "not implemented"
signum = error "not implemented"
一旦到位,size (2+3)
将起作用(注意括号)。