首页 文章

OCaml计算列表中的连续元素

提问于
浏览
0

我'm writing OCaml code that reads in a list and removes any char '我出现在列表的开头 . 例如,列表 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'作为元组的一部分时,我一直收到错误 . 有人能把我推向正确的方向吗?谢谢!

1 回答

  • 0

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

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

    现在你有这个:

    removeI (y :: t1)
    

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

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

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

    作为一个评论,如果它看起来特别一致,我不想删除 'i' .

相关问题