Сопоставление с шаблоном «Some and None» не соответствует параметру float in float? - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь сопоставить число с плавающей запятой, возвращенное с List.Assoc.find (опция с плавающей запятой).

Я использую сопоставление с образцом, но, похоже, оно не работает.

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 голос
/ 21 марта 2019

Подпись 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 является 3-м параметром подписи выше, поэтому он вводится как строка (это определяется ограничением типа функции evalVar).

Ниже приведен примериз List.Assoc.find:

utop # List.Assoc.find [("a",1);("b",2)] ~equal:(fun  _a _b -> _a=_b) "a";;
- : int option = Some 1
...