微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果字符列表中存在字符,则 OCaml 计数:语法错误

如何解决如果字符列表中存在字符,则 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_as 的情况下编写一个递归版本的计数(并可能将其重命名为 if):

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。