我想构建一个类型列表(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;;
答案 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指出的那样)。