追加到哈希表时的OCaml模式匹配范围问题

时间:2018-11-18 23:57:38

标签: design-patterns ocaml hashtable matching

我正在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

1 个答案:

答案 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),因此打开它没有任何好处。最好打开尽可能少的模块。