Обнаружена ошибка несвязанного значения при использовании Ocaml StringMap.find_opt - PullRequest
0 голосов
/ 21 апреля 2019

Я пытался написать небольшую программу ocaml и обнаружил ошибку несвязанного значения при использовании StringMap.find_opt.

Я смущен этой ошибкой, поскольку find_opt in определен в https://caml.inria.fr/pub/docs/manual-ocaml/libref/Misc.StringMap.html

Я нашел Посмотрите, существует ли ключ в String Map и попытался использовать StringMap.find вместо этого, но ясно, что в моей программе StringMap.find определен как val find: key -> 'at ->' a it itне может вернуть значение типа 'опция по желанию.

Ошибка выглядит следующим образом:

$ 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)

в начало моего файла.Edit2: Оказывается, у моего верхнего уровня ocaml есть версия 4.02.3, и это вызвало проблему.Спасибо за помощь!

1 Ответ

1 голос
/ 21 апреля 2019

Насколько я могу судить, фактического модуля Misc нет.Я никогда не слышал об этом, и, похоже, он не фигурирует в настоящем тексте руководства.Единственная ссылка (которую я могу найти) - из индекса модулей.Я думаю, что это может представлять непреднамеренную утечку некоторых внутренних модулей.(Но я могу ошибаться.)

Вы можете создать свой собственный модуль StringMap следующим образом:

module StringMap = Map.Make(String)

Функция find_opt была введена в OCaml 4.05.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...