OCaml 计算 char 是否存在于 char 列表中:语法错误

OCaml Counting if char exists in char list : syntax error

let count (l: char list) : bool =
  let cnt = 0 in
  let rec check l =
    match l with
    | [] -> false
    | h::t -> if h = 'a' then 
  let cnt + 1
  check t
  else check t
  in check []
;;

语法错误的原因是什么?

如果 'a' 存在我想加 1,如果 'b' 存在我想加 -1

OCaml 是一种函数式语言,变量是不可变的(它们的内容可能是可变的,但这不是默认值)。 因此,

let cnt + 1

既是语法错误又是逻辑错误:不可能以这种方式更新cnt。 作为第一步,我建议在不使用 ifs 的情况下编写一个递归版本的计数(并可能将其重命名为 exists_a):

let rec count l = match l with
| [] -> ...
| 'a' :: t -> ...
| _ :: t -> ...

你应该这样写:

let rec count l =
  match l with
  | [] -> 0
  | c::t -> if c = 'a' then 1 + count t else count t

但这不是尾递归。要使其成为尾递归,您必须添加一个累加器并编写一个辅助函数:

let count l =
  let rec aux cnt l =
    match l with
    | [] -> cnt
    | c::t -> if c = 'a' then aux (cnt + 1) t else aux cnt t
  in
  aux 0 l

现在这是尾递归,但写起来有点长,所以你可以只使用 List.fold_left 并且仍然有尾递归函数:

let count l =
  List.fold_left (fun cnt c -> if c = 'a' then cnt + 1 else cnt) 0 l