-2

我有以下类型值,我想根据这些类型进行计算,但我收到一条错误消息:

此表达式具有类型值,但表达式应为 int 类型

那么我应该怎么做计算呢?

type binop = 
  | Plus 
  | Minus 
  | Mul 
  | Div 
  | Eq 
  | Ne 
  | Lt 
  | Le 
  | And 
  | Or          
  | Cons

type expr =   
  | Const of int 
  | True   
  | False      
  | NilExpr
  | Var of string    
  | Bin of expr * binop * expr 
  | If  of expr * expr * expr
  | Let of string * expr * expr 
  | App of expr * expr 
  | Fun of string * expr    
  | Letrec of string * expr * expr

type value =  
  | Int of int      
  | Bool of bool          
  | Closure of env * string option * string * expr 
  | Nil                    
  | Pair of value * value 

val x : value = Int 1
val x : value = Int 1

当我这样做时

 x+x;;

然后它会抛出错误,我想要这样的东西:

 Nano.value = Int 2

修复这样的东西,它会返回value = Int一些东西,但我想要Nano.value = Int一些东西,以及名为 Nano.ml 的文件,所以我想要Nano.value

let add (x,y) = match (x,y) with 
   | (Int xx, Int yy) -> Int (xx + yy)
   | ( _ , _) -> Int 0
4

2 回答 2

1

正如其他答案所提到的,您需要为该类型定义自己的“加号”运算符value。像这样的东西应该工作:

exception Bad_addition

let rec (++) a b = match (a,b) with
  | (Int(x),Int(y)) -> Int(x+y)
  | (Bool(x),Bool(y)) -> Bool(x || y)
  | (Nil,Nil) -> Nil
  | (Pair(x1,y1),Pair(x2,y2)) -> Pair(x1 ++ x2,y1 ++ y2)
  | _ -> raise Bad_addition

这将为您提供一个名为的运算符++,然后您可以使用它来将值相加。例如,做Int(1) ++ Int(1)会产生结果Int(2)

请注意,我已将布尔值的“加法”定义为逻辑或,将两个Nil值的加法定义为Nil,并将对的加法定义为逐点加法,但您可以为这些实现不同的行为。

于 2013-02-15T19:13:55.117 回答
1

没有为 value 类型的值定义“+”运算符,所以这里发生的情况是您正在为整数调用“+”运算符。

您需要定义一个运算符来添加您的值类型:

let ( +! ) x y = match (x,y) with 
   | (Int xx, Int yy) -> xx + yy
   |  _ -> raise <some exception>

Int 8 +! Int 2  ... should yield 10.

(注意:我现在无法轻松访问 OCaml REPL,因此可能无法编译)

另外,不确定添加两个闭包、Nil's 或 Pair's 意味着什么,您必须为您的加法运算符确定这一点,您会注意到我只是为除 Ints 之外的任何东西提出了一些例外。您需要填写适合该类型的操作。

于 2013-02-15T17:31:02.857 回答