OCaml计算列表

时间:2017-07-21 02:32:19

标签: list recursion tuples ocaml caml

我正在编写读取列表的OCaml代码,并删除列表开头出现的所有字符。\ n例如,列表removeI['i';'i';'a';'c';'i']应该返回-: int * char list = ['a';'c';'i'],因为列表的开头有2个。{i}。我相信我知道如何正确实施这一点;但是,我想要返回一个元组,其中包含删除的'以及删除了' i的新列表。我知道这可能听起来令人困惑,但一个例子是removeI['i';'i';'a';'c';'i'] -: int * char list = (2,['a';'c';'i'])我已经删除了2个,并删除了新列表。

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

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

这会删除第一个删除的列表,但是当我尝试将已删除的' i的数量作为元组的一部分时,我会一直收到错误。有人能把我推向正确的方向吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

现在你有这个:

removeI (y :: t1)

但你需要更像这样的东西:

let (count, list) = removeI (y :: t1) in
(* Newly calculated count and list *)

请注意,您的基本案例还必须返回一个计数和一个列表。

作为旁注,我实际上并不理解你的第二个基本案例。如果它是列表中唯一的内容,您不想删除'i'吗?这似乎并不特别一致。