Haskell 计算表达式中的运算符数-无法推断实例
我正在研究一个可以计算表达式中使用的运算符数量的函数。我的代码如下:Haskell 计算表达式中的运算符数-无法推断实例,haskell,functional-programming,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执
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+3
不是一个有效的表达方式。对于您的类型,原始值是使用Lit
数据构造函数创建的,有效的运算符是:+:
和:-:
。所以你真正需要的是lit2:+:lit3
。所以试试看
size (Lit 2 :+: Lit 3)
您可以将其设置为Num实例:
instance Num Expr where
(+) = (:+:)
(-) = (:-:)
negate = (0 -)
fromInteger = Lit . fromInteger
(*) = error "not implemented"
abs = error "not implemented"
signum = error "not implemented"
一旦这一切就绪,
size(2+3)
将起作用(注意括号)。+1感谢我没有一个SO帐户,问了一个格式、措辞和标记都很好的问题。你缺少了2+3左右的括号。另外,您必须向Expr类型中添加Num的实例。我的印象是“:”将用作中缀构造函数。我真的不想让任何人帮我做家庭作业,但要让函数大小取(2+3)作为参数,需要做什么呢。我对Expr的定义是错的还是函数大小本身错了?@user967306:这些都没有错,(2+3)
根本不是一个Expr
,而是一个整数(实际上Num a=>a
)。如果你想构造一个Expr
树,你必须显式地使用那些构造函数(省去一些聪明的技巧,比如把Expr
作为Num
的实例,定义fromInteger=Lit
和(+)=(:+:)
,这可能是无意的,而且在任何情况下都可能不利于清晰,但如何做到这一点,请参见Ramon的评论)。