Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/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
Functional programming OCaml类型错误_Functional Programming_Ocaml_Typeerror - Fatal编程技术网

Functional programming OCaml类型错误

Functional programming OCaml类型错误,functional-programming,ocaml,typeerror,Functional Programming,Ocaml,Typeerror,我有以下来自OCaml的错误,我不明白为什么。我试图用OCaml定义一个解释器。我有一些类型和函数来评估这些类型。我粘贴相关代码 我有以下几种: type ide = string type exp = Eint of int | Ebool of bool | Var of ide | Prod of exp * exp | Sum of exp * exp | Diff of exp * exp | Eq of exp * exp | Minus of exp | Iszero of ex

我有以下来自OCaml的错误,我不明白为什么。我试图用OCaml定义一个解释器。我有一些类型和函数来评估这些类型。我粘贴相关代码

我有以下几种:

type ide = string

type exp = Eint of int
| Ebool of bool
| Var of ide
| Prod of exp * exp
| Sum of exp * exp
| Diff of exp * exp
| Eq of exp * exp
| Minus of exp
| Iszero of exp
| Or of exp * exp
| And of exp * exp
| Not of exp
| Ifthenelse of exp * exp * exp
| Let of ide * exp * exp
| Fun of ide list * exp
| Funval of exp * exp env 
| Appl of exp * exp list 
| Dot of ide * field_name
|Field of ide * exp
| Record of ide * exp list;;

type 'a env = Env of (ide * 'a) list;;
我有一个函数eval用于eval exp。它工作正常

let rec eval ((e: exp), (r: exp env)) =
match e with
| Eint(n) -> Eint(n)
| Ebool(b) -> Ebool(b)
| Var(i) -> lookup r i
| Iszero(a) -> iszero(eval(a, r))
| Eq(a, b) -> equ(eval(a, r),eval(b, r))
| Prod(a, b) -> mult(eval(a, r), eval(b, r))
| Sum(a, b) -> plus(eval(a, r), eval(b, r))
| Diff(a, b) -> diff(eval(a, r), eval(b, r))
| Minus(a) -> minus(eval(a, r))
| And(a, b) -> et(eval(a, r), eval(b, r))
| Or(a, b) -> vel(eval(a, r), eval(b, r))
| Not(a) -> non(eval(a, r))
| Ifthenelse(a, b, c) -> let g = eval(a, r) in
if typecheck("bool", g) then
(if g = Ebool(true) then eval(b, r) else eval(c, r))
else failwith ("nonboolean guard")
| Let(i, e1, e2) ->
eval(e2, bind (r, i, eval(e1, r)))
|  Fun(x, a) -> Funval(e, r)
| Appl(e1, e2) -> match eval(e1, r) with
| Funval(Fun(x, a), r1) ->
eval(a, bind_list r1 x e2)
| _ -> failwith("no funct in apply")

let eval_field (field:exp) (r: exp env)= match field with
| Field (id, e) -> Field (id, (eval e r))
| _ -> failwith ("Not a Field");;
最后,我有一个函数来评估记录字段:

let eval_field (field:exp) (r: exp env)= match field with
| Field (id, e) -> Field (id, (eval e r))
| _ -> failwith ("Not a Field");;
问题在于eval_字段:OCaml向我发出错误信号:

Characters 22-24:
let f1 = Field ("f1", e1);;
                    ^^
Error: This expression has type exp/1542
but an expression was expected of type exp/2350
有什么不对劲吗?
非常感谢您的帮助。

编译器试图告诉您,您有两种不同的类型,分别命名为
exp
,其中一种类型与另一种类型相同

在此代码中,我只看到类型
exp
的一个定义。我怀疑你的环境不干净。您可以尝试在新的OCaml解释器中加载代码。或者问题在于某些代码没有显示

下面是一个演示如何产生错误的会话:

$ ocaml
        OCaml version 4.02.1

# type abc = A | B | C;;
type abc = A | B | C
# let f (x: abc) = x = A;;
val f : abc -> bool = <fun>
# type abc = A | B | C;;
type abc = A | B | C
# f (C: abc);;
Error: This expression has type abc/1024
       but an expression was expected of type abc/1018
$ocaml
OCaml版本4.02.1
#abc型=A | B | C;;
abc型=A | B | C
#设f(x:abc)=x=A;;
val f:abc->bool=
#abc型=A | B | C;;
abc型=A | B | C
#f(C:abc);;
错误:此表达式的类型为abc/1024
但应为abc/1018类型的表达式

我猜您有一个函数(比如这里的
f
),它是使用
exp
类型的旧定义定义的。但是您使用新定义的类型(如下所示)中的值来调用它。

在Ocaml中,大多数时候您不必给出对象的类型,比如field:exp,他会为您提供。exp类型定义了两次。(值得一提的是,我觉得这似乎不对,或者至少我在这里只看到了
exp
的一个定义。此外,它可以作为标记函数参数类型的有用文档。)
eval\u字段
不包含该行。它看起来更像是您在解释器中以交互方式输入的。