Проблема «Сопоставление с образцом не является исчерпывающим» и «этот случай совпадения не используется»

#ocaml

#ocaml

Вопрос:

Я работаю над кодом для назначения, и в части моего кода я сталкиваюсь с проблемами, связанными с сопоставлением шаблонов в OCaml, и я не могу понять это.

     fun frag -> match make_and_parser t pf frag with
                | (Some children, suffix) -> match make_or_parser (pf h) pf suffix with
                                            | (None, left) -> (Some children, left)
                                            | (Some tree, left) -> (Some (children @ tree), left)
                | (None, suffix) -> match make_or_parser (pf h) pf suffix with
                                    | (None, left) -> (None, left)
                                    | (Some tree, left) -> (Some tree, left))
  

Ошибка, которую я получаю, относится к этой части

 Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
(None, _)
File "make_parser.ml", line 42, characters 10-24:
Warning 11: this match case is unused.
val make_parser :
'a * ('a -> ('a, 'b) symbol list list) ->
'b list -> (('a, 'b) symbol list, 'b) parse_tree list option = <fun>
  

Мне было интересно, есть ли что-то очевидное, чего мне не хватает

Ответ №1:

Вам нужно добавить круглые скобки. С вашим кодом это то, что видит OCaml:

 fun frag ->
    match make_and_parser t pf frag with
    | (Some children, suffix) -> match make_or_parser (pf h) pf suffix with
                                 | (None, left) -> (Some children, left)
                                 | (Some tree, left) -> (Some (children @ tree), left)
                                 | (None, suffix) -> match make_or_parser (pf h) pf suffix with
                                                     | (None, left) -> (None, left)
                                                     | (Some tree, left) -> (Some tree, left))
  

Из этого очевидно, что первое совпадение с шаблоном не является исчерпывающим. В нем отсутствует шаблон для (None, _) . Из этого также очевидно, что во втором совпадении с шаблоном есть неиспользуемый случай совпадения (т. Е. (None, suffix) ).

Чтобы исправить вашу проблему:

 fun frag ->
    match make_and_parser t pf frag with
    | (Some children, suffix) -> (match make_or_parser (pf h) pf suffix with
                                 | (None, left) -> (Some children, left)
                                 | (Some tree, left) -> (Some (children @ tree), left))
    | (None, suffix) -> (match make_or_parser (pf h) pf suffix with
                        | (None, left) -> (None, left)
                        | (Some tree, left) -> (Some tree, left))
  

Обратите внимание на добавление дополнительных круглых скобок вокруг совпадений с шаблоном.

В заключение, вы были введены в заблуждение своим собственным отступом.