Types ocaml定义类型并将其用于计算

Types ocaml定义类型并将其用于计算,types,ocaml,Types,Ocaml,我有以下类型值,我想基于这些类型进行计算,但我得到一个错误,即: 此表达式具有类型值,但表达式应为int类型 那么我应该做什么来进行计算呢 type binop = | Plus | Minus | Mul | Div | Eq | Ne | Lt | Le | And | Or | Cons type expr = | Const of int | True | False

我有以下类型值,我想基于这些类型进行计算,但我得到一个错误,即:

此表达式具有类型值,但表达式应为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
something,但我需要
Nano.value=Int
something,以及名为Nano.ml的文件,因此我需要
Nano.value

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

没有为value类型的值定义“+”运算符,因此这里发生的是为整数调用“+”运算符

您需要定义用于添加值类型的运算符:

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

Int 8 +! Int 2  ... should yield 10.
let(+!)xy=将(x,y)与
|(整数xx,整数yy)->xx+yy
|提高
智力8+!INT2。。。应产生10。
(注意:我现在无法轻松访问OCaml REPL,因此可能无法编译)


另外,不确定添加两个闭包(Nil或Pair)意味着什么,您必须确定对于加法运算符,您会注意到我只是对int以外的任何东西提出了一些异常。您需要填写适合该类型的操作。

正如其他答案所述,您需要为
值定义自己的“加号”运算符。像这样的方法应该会奏效:

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)


注意,我已经将布尔的“加法”定义为逻辑or,将两个
Nil
值相加为
Nil
,将对相加为逐点加法,但您可能需要为它们实现不同的行为。

No,+的类型为:
int->int->int
;您应该为您的类型定义自己的加法运算符,如中所示,
value->value->value
。在上面的固定区域。但它返回一个值=Int 10;但是我想要像Nano.value=int10这样的东西;如果模块打开,REPL不会打印出
Nano
。它们在功能上是相同的输出。为什么这么挑剔?
Nano.value
模块内的
Nano
值刚刚被REPL打印为
value
。不要打开Nano模块?当我只是“加载”nano.cmo时,我得到了你想要的行为。(正如nlucaroni明智地指出的那样,对顶层工作方式过于挑剔是没有好处的。你应该与之合作,而不是反对它。)