#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))
Обратите внимание на добавление дополнительных круглых скобок вокруг совпадений с шаблоном.
В заключение, вы были введены в заблуждение своим собственным отступом.