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
。
作为第一步,我建议在不使用 if
s 的情况下编写一个递归版本的计数(并可能将其重命名为 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
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
。
作为第一步,我建议在不使用 if
s 的情况下编写一个递归版本的计数(并可能将其重命名为 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