Как исправить «сопоставление с образцом не является исчерпывающим», - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу написать функцию, которая будет добавлять два элемента типа eval

type eval = Num of float | Neg | Add | Sub | Mul | Div;;

Компилятор OCaml выдает мне это предупреждение, но я не знаю точно, чего он хочет.Это работает, но я хочу сделать это без этого предупреждения.

# let (+++) (Num a) (Num b) =
  match (Num a), (Num b) with
  | (Add|Neg|Sub|Mul|Div), _ -> failwith "01"
  | _, (Add|Neg|Sub|Mul|Div) -> failwith "02"
  | _, _ -> Num (a +. b)
  ;;        
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
(Neg|Add|Sub|Mul|Div)
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
(Neg|Add|Sub|Mul|Div)
val ( +++ ) : eval -> eval -> eval = <fun>

1 Ответ

0 голосов
/ 28 ноября 2018

Здесь представлены неисчерпывающие шаблоны:

 let (+++) (Num a) (Num b) = ...

Используя этот шаблон, вы выдвигаете гипотезу о том, что аргумент +++ всегда имеет форму Num _, не применяя его в типесистема.Если вы хотите избавиться от предупреждения, вы должны расширить сопоставление с образцом, чтобы охватить все остальные случаи:

 let (+++) x y = match x, y with 
 | ...
...