我尝试编写一个小的ocaml程序,并在使用StringMap.find_opt时遇到了未绑定的值错误。
由于在https://caml.inria.fr/pub/docs/manual-ocaml/libref/Misc.StringMap.html中定义了find_opt,我对此错误感到困惑
我发现See if key exists in a String Map并尝试改用StringMap.find,但是很明显,在我的程序中,StringMap.find被定义为val find:key->'at->'a,因此它不能返回类型为''的值一个所需的选项。
错误如下所示:
$ ocamlbuild test.native
+ /Users/KKK/.opam/default/bin/ocamlc.opt -c -o semant.cmo semant.ml
File "semant.ml", line 253, characters 19-37:
Error: Unbound value StringMap.find_opt
Command exited with code 2.
Compilation unsuccessful after building 13 targets (11 cached) in 00:00:00.
,相关代码如下:
let f2 = function
Some _ -> raise (Failure ("trying to redeclare variable"))
| None ->
let f3 = function
Array(t1, t2) ->
if (check_array_type (t1, t2)) then let lvs' = StringMap.add id t envs.lvs in let envs2 = {stmts = SVdecl(t, id, (Void, SNoexpr)) :: envs.stmts; lvs = lvs'} in envs2
else raise(Failure("array key must be int or string"))
| _ -> let lvs' = StringMap.add id t envs.lvs in let envs2 = {stmts = SVdecl(t, id, (Void, SNoexpr)) :: envs.stmts; lvs = lvs'} in envs2
in f3 t
in f2 (StringMap.find_opt id envs.lvs)
编辑: 我的Ocaml版本是4.07.1。并且我已经包含
module StringMap = Map.Make(String)
在文件开头。 编辑2: 事实证明,我的顶级ocaml具有版本4.02.3,这引起了问题。感谢您的帮助!
答案 0 :(得分:1)
据我所知,没有实际的Misc
模块。我从未听说过,它似乎没有出现在手册的实际文本中。 (我可以找到)唯一的链接来自模块的索引。我认为这可能表示某些内部模块意外泄漏。 (但我可能是错的。)
您可以像这样制作自己的StringMap模块:
module StringMap = Map.Make(String)
OCaml 4.05中引入了find_opt
函数。