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

tvd*_*tvd 4 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)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用Hugs98执行此代码时,我收到以下错误:

Main> size 2+3
ERROR - Cannot infer instance
*** Instance   : Num Expr
*** Expression : size 2 + 3
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?我真的不在乎自己.

Fre*_*abe 5

2+3不是一个有效的表达.对于您的类型,使用Lit数据构造函数创建原始值,有效运算符为:+::-:.所以你真正需要的是Lit 2 :+: Lit 3.所以试试吧

size (Lit 2 :+: Lit 3)
Run Code Online (Sandbox Code Playgroud)

  • @ user967306:没有什么不对的,`(2 + 3)`根本不是'Expr`,它是一个整数(好吧,实际上是'Num a => a`).如果你想构造一个`Expr`树,你必须明确地使用那些构造函数(保存聪明的技巧,比如使`Expr`成为`Num`的实例并定义`fromInteger = Lit`和`(+)=(:+: )`,这可能不打算做,而且在任何情况下可能都不清楚 - 但请参阅Ramon关于它是如何完成的评论. (3认同)