在OCaml中未使用的匹配案例

时间:2016-05-01 13:51:08

标签: ocaml

我想构建一个类型列表(char,'list)列表,其中每个char都是字母表的大写字母。我在get_list的第二个匹配案例中收到警告Warning 11: this match case is unused.。我在第一个案例上做了一些打印,发现len得到的值为0,所以它从不使用第二种情况。发生了什么事?

let rec get_list abc i len = 
  match i with 
  | len -> []
  | _ -> ((String.get abc i), [])::get_list abc (i + 1) len

in

let rec print_list l = 
  match l with
  | [] -> ()
  | h::t -> print_char(fst h);print_list t
in

let abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" in
let abc_l = get_list abc 0 (String.length abc) in
print_list abc_l;;

2 个答案:

答案 0 :(得分:1)

它不起作用的原因

写作时

match i with 
  | len -> []
  | _ -> ["..."]

len是一种通用模式,与上面的len定义无关。在模式匹配中,您只定义变量的外观,您描述它的一般“结构”,变量名称用于命名模式匹配的不同部分,并且是新变量。例如,您可以执行以下列表:

match my_list with 
  | [x,y,z] -> x+y+z
  | x :: r  -> x + (List.length r)
  | anything_else -> List.length anything_else

当你输入'_'时,它只是一个惯例,说“我不介意它是哪个值,我不需要它”。这是元组的另一个例子:

match my_tuple with 
  | (a,b) -> a+b

解决方案:条件模式匹配

如果您想将条件置于模式匹配中,可以使用when关键字:

match i with 
  | n when n = len -> []
  | _ -> ["..."]

另一个“排序”元组的例子:

match my_tuple with 
  | (a,b) when a>b -> (a,b)
  | (a,b)          -> (b,a)

或者只使用带整数的条件:

if i = len then []
else ["..."]

您还可以注意到,您可以在函数中进行模式匹配:

let f (a,b) = a+b

答案 1 :(得分:0)

模式中的len是模式引入的新变量。作为一种模式,它的意思是它将匹配任何东西。因此,下一个模式_永远不会匹配。

正如@AlexanderRevyakin所说,这个新变量len隐藏了名为len的参数。

模式中的len表示参数len的值。 OCaml模式仅包含新变量(绑定匹配值的片段)和常量。它们不包含在运行时评估的表达式。为此,你想使用if/then/else(正如@AntonTrunov指出的那样)。