Сопоставление шаблонов ‘Some и None’ не соответствует параметру float в float?

#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