2013-02-15 44 views
-2

我有以下类型值,我想要做这些类型的计算基础,但我得到了一个错误,说:ocaml的定义类型,并将其用于计算

这个表达型价值,但一表达预期的类型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 

回答

1

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

您需要定义一个运营商增加你的价值类型:

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或Pair是什么意思,你必须确定对于你的添加操作符,你会注意到我只是提出了一些除Ints之外的异常。您需要填写适合该类型的操作。

+0

我应该更新类型,看到是会帮助“+”? – user1968057 2013-02-15 17:33:21

+0

不,+具有类型:'int - > int - > int';你应该为你的类型定义你自己的加法运算符,如'value - > value - > value'。 – nlucaroni 2013-02-15 17:35:44

+0

我写过这样的东西。以上在修复区域。但它返回一个值= Int 10;但我想要Nano.value = Int 10; – user1968057 2013-02-15 19:03:02

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,并且除了对被逐点增加,但你可能会实现这些不同的行为。

相关问题