我正在OCaml中进行解释器分配,在其中必须绑定值。例如,我可能想将值“ A”绑定到值3。
我正在尝试使用ocaml中的哈希表模块来简化存储和查找,但是似乎存在与范围界定和返回类型相关的多个问题。
我想做的是,当第二个值从堆栈中弹出的情况是名称类型时,我想将NAME绑定到第一个弹出的值,然后将UNIT附加到堆栈中。不幸的是,由于某种原因,我的解决方案无法正常工作。谁能帮我吗?
open Hashtbl;;
let bound_values = Hashtbl.create 123456
type stackVal =
INT of int
| STR of string
| BOOL of bool
| NAME of string
| UNIT of unit
| ERROR
let callBind (stk : stackVal list) : stackVal list =
match (stk) with
x::NAME(y)::stk -> UNIT(Hashtbl.add bound_values y x)::stk
| _ -> ERROR::stk
答案 0 :(得分:0)
在定义哈希表之前,您需要先定义类型stackVal
。否则,该类型从技术上讲属于内部作用域。换一种说法是,您期望表包含创建表时不存在的类型的值。
下面是两个小例子,显示了两个订单的效果:
$ ocaml
OCaml version 4.06.1
# let ht = Hashtbl.create 1;;
val ht : ('_weak1, '_weak2) Hashtbl.t = <abstr>
# type t = A | B;;
type t = A | B
# let () = Hashtbl.add ht "key" A;;
Error: This expression has type t but an expression
was expected of type 'a
The type constructor t would escape its scope
#
$ ocaml
OCaml version 4.06.1
# type t = A | B;;
type t = A | B
# let ht = Hashtbl.create 1;;
val ht : ('_weak1, '_weak2) Hashtbl.t = <abstr>
# let () = Hashtbl.add ht "key" A;;
# Hashtbl.find ht "key";;
- : t = A
#
作为旁注,我不会打开Hashtbl
模块。您的代码已经使用全名(Hashtbl.x
),因此打开它没有任何好处。最好打开尽可能少的模块。