如何解决如果字符列表中存在字符,则 OCaml 计数:语法错误
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
解决方法
你应该这样写:
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
,
OCaml 是一种函数式语言,变量是不可变的(它们的内容可能是可变的,但这不是默认值)。 因此,
let cnt + 1
既是语法错误也是逻辑错误:不可能以这种方式更新 cnt
。
作为第一步,我建议在不使用 exists_a
s 的情况下编写一个递归版本的计数(并可能将其重命名为 if
):
let rec count l = match l with
| [] -> ...
| 'a' :: t -> ...
| _ :: t -> ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。