计算表达式中的运算符数 - 无法推断实例

时间:2011-09-27 14:58:19

标签: haskell functional-programming

我正在开发一个可以计算表达式中使用的运算符数的函数。我的代码如下:

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

有人可以告诉我我做错了什么吗?我真的不在乎自己。

2 个答案:

答案 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)将起作用(注意括号)。