Types 为什么这种类型的错误不断发生?

Types 为什么这种类型的错误不断发生?,types,ocaml,Types,Ocaml,我有一个ocaml函数,其中我匹配了几个案例。我一直收到一个类型错误,我不知道如何处理它。任何帮助都将不胜感激。这是我收到的错误消息:“File“eval.ml”,第40行,字符18-35: 错误:此表达式的类型为“Env.symEntry”。第40行是带有“let l=binding_of env x in”的行 以下是我使用的一些函数和类型的代码: module IntMap = Map.Make(struct type t = int let compare = compare end);

我有一个ocaml函数,其中我匹配了几个案例。我一直收到一个类型错误,我不知道如何处理它。任何帮助都将不胜感激。这是我收到的错误消息:“File“eval.ml”,第40行,字符18-35: 错误:此表达式的类型为“Env.symEntry”。第40行是带有“let l=binding_of env x in”的行

以下是我使用的一些函数和类型的代码:

module IntMap = Map.Make(struct type t = int let compare = compare end);;
type store = int IntMap.t;;
let value_at store loc = IntMap.find loc store;;
let insert_value store loc v =  IntMap.add loc v store;;


let enter_scope env scope = scope::env;;
let exit_scope env = List.tl env;;
let current_scope env = List.hd env;;

type expr = (* Expressions in C-flat *)

  (* int operations *)
  Add of expr * expr
| Sub of expr * expr
| Mul of expr * expr
| Div of expr * expr
| Neg of expr

  (* constants/variables *)
| Id of string
| IntConst of int

  (* array/pointer operations *)
| At of expr * expr
| Deref of expr
| AddressOf of expr

  (* function *)
| Call of string * expr list

  (* pre- & post-increment *)
| Pre of expr
| Post of expr
;;



let binding_of env name = 
  let lookup name symTab = List.assoc name symTab in
  try 
    lookup name (List.hd env)
  with Not_found ->
    lookup name (List.hd (List.tl env))
;;

您没有显示足够的定义,无法看到您提到的行上发生了什么


我猜
binding\u of_env
不会返回位置,但是
value\u at
需要一个位置。您可能需要从绑定中提取位置。

如果您需要CSE 307项目的帮助,请在办公时间前来


你的助教;-)

我在代码中添加了“binding_of”,请查看。我正在查看,但是仍然没有足够的细节来查看作用域的类型。如果您只需研究第40行中的子表达式类型,您几乎肯定会找到问题所在。作为旁注,函数的
binding_不会遍历整个列表。它只在前两个环境中显示(在我看来)。
module IntMap = Map.Make(struct type t = int let compare = compare end);;
type store = int IntMap.t;;
let value_at store loc = IntMap.find loc store;;
let insert_value store loc v =  IntMap.add loc v store;;


let enter_scope env scope = scope::env;;
let exit_scope env = List.tl env;;
let current_scope env = List.hd env;;

type expr = (* Expressions in C-flat *)

  (* int operations *)
  Add of expr * expr
| Sub of expr * expr
| Mul of expr * expr
| Div of expr * expr
| Neg of expr

  (* constants/variables *)
| Id of string
| IntConst of int

  (* array/pointer operations *)
| At of expr * expr
| Deref of expr
| AddressOf of expr

  (* function *)
| Call of string * expr list

  (* pre- & post-increment *)
| Pre of expr
| Post of expr
;;



let binding_of env name = 
  let lookup name symTab = List.assoc name symTab in
  try 
    lookup name (List.hd env)
  with Not_found ->
    lookup name (List.hd (List.tl env))
;;