我正在解决 ocaml 中哈佛 CS 51 编程课程的编程课程。问题是定义一个函数,该函数可以将字符列表压缩为对列表,其中每对包含列表中字符和字符本身的许多后续出现,即在将此函数应用于列表 ['a' ;'a';'a';'a';'a';'b';'b';'b';'c';'d';'d';'d';'d'] 我们应该得到 [(5,'a');(3,'b');(1,'c');(4,'d')] 的列表。我想出了使用辅助函数 go 来解决这个问题的函数:
let to_run_length (lst : char list) : (int*char) list =
  let rec go i s lst1 =
    match lst1 with
      | [] -> [(i,s)]
      | (x::xs) when s <> x ->  (i,s) :: go 0 x lst1
      | (x::xs) -> go (i + 1) s xs
        in match lst with
          | x :: xs -> go 0 x lst
          | [] -> []
我的问题是:是否可以在不定义辅助函数 go 的情况下使用嵌套模式匹配定义递归函数 to_run_length。在这种情况下,我们如何存储已通过元素的计数器状态?