Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 计算表达式中的运算符数-无法推断实例_Haskell_Functional Programming - Fatal编程技术网

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的评论)。