#ocaml #typeerror
#ocaml #ошибка типа
Вопрос:
Я пытаюсь сопоставить значение float, возвращенное из List.Assoc.find
(опция float).
Я использую сопоставление шаблонов, но, похоже, это не работает.
let evalVar (_x: string) (_q:envQueue): float =
match List.Assoc.find _q _x with
Some(s) -> s
| None -> 0.0
Я получаю эту ошибку:
Error: This pattern matches values of type 'a option
but a pattern was expected which matches values of type
equal:(string -> string -> bool) -> float option
Комментарии:
1. Просто примечание: добавление к идентификатору символа подчеркивания подавляет предупреждения о неиспользуемых именах. Его не следует использовать для имен, которые не являются неиспользуемыми, поскольку тогда предупреждение и этот признак того, что оно преднамеренное, теряют свою цель.
Ответ №1:
Подпись List.Assoc.find
является :
utop # List.Assoc.find;;
- : ('a, 'b) List.Assoc.t -> equal:('a -> 'a -> bool) -> 'a -> 'b option =
<fun>
List.Assoc.find
ожидает equal
параметр, который является функцией.
Ocaml интерпретирует код List.Assoc.find _q _x
как :
-
_q
: является первым параметром, поэтому его тип('a, 'b) List.Assoc.t
. -
Поскольку
equal
не упоминается,_x
является третьим параметром подписи здесь выше, следовательно, он вводится в виде строки (это определяется ограничением типа функцииevalVar
).
Ниже приведен пример List.Assoc.find
:
utop # List.Assoc.find [("a",1);("b",2)] ~equal:(fun _a _b -> _a=_b) "a";;
- : int option = Some 1