匹配OCaml中未使用的大小写

匹配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)

我想建立一个类型列表(char,'a list),其中每个char都是字母表的大写字母。我收到一条警告
警告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