List OCaml统计列表中的连续元素

List OCaml统计列表中的连续元素,list,recursion,tuples,ocaml,caml,List,Recursion,Tuples,Ocaml,Caml,我正在编写OCaml代码,读取列表并删除列表开头出现的任何字符“I”。例如,列表removeI['i';'i';'a';'c';'i']应该返回-:int*char list=['a';'c';'i'],因为列表的开头有两个'i'。我相信我知道如何正确地实施这一点;但是,我想返回一个元组,其中包括删除的'I'的数量以及带有'I's removed'的新列表。我知道这听起来可能会让人困惑,但举个例子就是removeI['I';'I';'a';'c';'I']-:int*char list=(2,[

我正在编写OCaml代码,读取列表并删除列表开头出现的任何字符“I”。例如,列表
removeI['i';'i';'a';'c';'i']
应该返回
-:int*char list=['a';'c';'i']
,因为列表的开头有两个'i'。我相信我知道如何正确地实施这一点;但是,我想返回一个元组,其中包括删除的'I'的数量以及带有'I's removed'的新列表。我知道这听起来可能会让人困惑,但举个例子就是
removeI['I';'I';'a';'c';'I']-:int*char list=(2,['a';'c';'I'])
删除了2个'I',新列表中删除了'I'

到目前为止,我有以下功能:

let rec removeI list = match list with
| [] -> []
| x::[] -> x::[]
| x::y::t1 -> if x='i' then removeI (y::t1)
              else list;;

这将返回包含第一个“i已删除”的列表,但当我尝试将已删除的“i”的数量作为元组的一部分时,会不断出错。谁能把我推向正确的方向?谢谢

递归调用将返回与整个函数相同的类型。因此,如果将函数更改为reuturn
(count,list)
,则递归调用也将返回该函数

通常,您希望收集返回的值并从中计算新值

现在,您只有以下内容:

removeI (y :: t1)
但你需要更像这样的东西:

let (count, list) = removeI (y :: t1) in
(* Newly calculated count and list *)
请注意,基本案例还必须返回计数和列表

作为旁白,我并不理解你的第二个基本情况。如果列表中只有一个
'i'
,您不想删除它吗?这似乎并不特别一致