【问题标题】:OCaml count consecutive elements in a listOCaml 计算列表中的连续元素
【发布时间】:2023-08-01 20:16:01
【问题描述】:

我正在编写 OCaml 代码,该代码读取一个列表并删除出现在列表开头的任何 char 'i's。例如,列表removeI['i';'i';'a';'c';'i'] 应该返回-: int * char list = ['a';'c';'i'],因为列表的开头有2 个'i'。我相信我知道如何正确实施;但是,我想返回一个元组,其中包括删除的 'i' 的数量以及删除了 'i' 的新列表。我知道这听起来可能令人困惑,但一个例子是 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' 的数量作为元组的一部分包含在内时,我不断收到错误消息。谁能把我推向正确的方向?谢谢!

【问题讨论】:

    标签: list recursion tuples ocaml caml


    【解决方案1】:

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

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

    现在你只有这个:

    removeI (y :: t1)
    

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

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

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

    作为旁注,我实际上并不了解您的第二个基本情况。如果 'i' 是列表中唯一的东西,您不想删除它吗?这似乎不是特别一致。

    【讨论】: