使用Ocaml StringMap.find_opt时遇到未绑定值错误

使用Ocaml StringMap.find_opt时遇到未绑定值错误,ocaml,Ocaml,我试图编写一个小的ocaml程序,但在使用StringMap.find_opt时遇到了一个未绑定的值错误 我被这个错误弄糊涂了,因为find_opt in是在中定义的 我找到并尝试改用StringMap.find,但很明显,在我的程序中StringMap.find被定义为val find:key->'a t->'a,因此它无法根据需要返回类型为'a option'的值 错误如下所示: $ ocamlbuild test.native + /Users/KKK/.opam/default/bin/

我试图编写一个小的ocaml程序,但在使用StringMap.find_opt时遇到了一个未绑定的值错误

我被这个错误弄糊涂了,因为find_opt in是在中定义的

我找到并尝试改用StringMap.find,但很明显,在我的程序中StringMap.find被定义为val find:key->'a t->'a,因此它无法根据需要返回类型为'a option'的值

错误如下所示:

$ 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)
相关代码如下所示:

$ 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,这导致了问题。谢谢你的帮助

据我所知,没有实际的
Misc
模块。我从未听说过,而且它似乎没有出现在手册的实际文本中。唯一的链接(我能找到)来自模块索引。我认为这可能代表一些内部模块的意外泄漏。(但我可能错了。)

您可以像这样创建自己的StringMap模块:

module StringMap = Map.Make(String)

find\u opt
函数是在OCaml 4.05中引入的。

能否显示您使用的是哪个版本的OCaml编译器?为此,只需使用
ocaml--version
的输出编辑您的问题。我能够在
编译器libs
包中找到
Misc
模块,使用
omod
utop#omod.load“Misc”;;[INC]/Users/sf/.opam/4.07.0/lib/ocaml[INC]/Users/sf/.opam/4.07.0/lib/ocaml/compiler-libs-:bool=true
但我无法将其加载到顶层…我确实通过在文件开头使用模块StringMap=Map.Make(String)创建了我自己的StringMap模块。@PLNewbie我猜,(根据我对你问题的评论)是因为您使用的是较旧版本的OCaml,在文档中介绍此函数之前。@ShonFeder这可能不是原因,因为我的OCaml版本为4.07.1。没问题!看起来像是
ocamlbuild-哪个ocaml
将显示它的构建版本。你能确认这显示的是旧版本吗?