匹配OCaml中未使用的大小写
我想建立一个类型列表(char,'a list),其中每个char都是字母表的大写字母。我收到一条警告匹配OCaml中未使用的大小写,ocaml,Ocaml,我想建立一个类型列表(char,'a list),其中每个char都是字母表的大写字母。我收到一条警告警告11:此比赛案例未使用。用于获取列表中的第二个比赛案例。我在第一个案例上做了一些打印,发现lenget的值为0,所以它从不使用第二个案例。发生了什么事 let rec get_list abc i len = match i with | len -> [] | _ -> ((String.get abc i), [])::get_list abc (i + 1)
警告11:此比赛案例未使用。
用于获取列表中的第二个比赛案例。我在第一个案例上做了一些打印,发现len
get的值为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;;
模式中的
len
是模式引入的新变量。作为一种模式,它的意思是它将匹配任何东西。因此,下一个模式将永远不会匹配
正如@AlexanderRevyakin所说,这个新变量len
隐藏了同样名为len
的参数
模式中的len
并不表示参数len
的值。OCaml模式只包含新变量(匹配值的片段绑定到新变量)和常量。它们不包含在运行时计算的表达式。为此,您需要使用if/then/else
(正如@AntonTrunov所指出的)。它不起作用的原因
当你写作时
将i与
|len->[]
| _ -> ["..."]
len
是一种通用模式,它与上面定义的len
无关。在模式匹配中,您只定义变量的外观,描述它的一般“结构”,变量名称用于命名模式匹配的不同部分,并且是新的变量。例如,对于列表,您可以执行以下操作:
将我的列表与
|[x,y,z]->x+y+z
|x::r->x+(List.length r)
|任何内容->列表。长度任何内容
当你用“u”这个词时,它只是一个惯例,意思是“我不在乎它是哪个值,我不需要它”。下面是另一个元组示例:
match my_tuple with
| (a,b) -> a+b
一种解决方案:条件模式匹配
如果要在模式匹配中设置条件,可以使用when
关键字:
将i与
|n当n=len->[]
| _ -> ["..."]
“排序”元组的另一个示例:
或者只对整数使用条件:
if i = len then []
else ["..."]
您还可以注意到,您可以在函数中进行模式匹配:
let f (a,b) = a+b
如果。。。然后。。。否则…expression而不是整数上的模式匹配——它可以更快地向读者传达意义,并且不那么容易出错。
let f (a,b) = a+b