Types ocaml定义类型并将其用于计算
我有以下类型值,我想基于这些类型进行计算,但我得到一个错误,即: 此表达式具有类型值,但表达式应为int类型 那么我应该做什么来进行计算呢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
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明智地指出的那样,对顶层工作方式过于挑剔是没有好处的。你应该与之合作,而不是反对它。)