我正在编写读取列表的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的数量作为元组的一部分时,我会一直收到错误。有人能把我推向正确的方向吗?谢谢!
答案 0 :(得分:0)
您的递归调用将返回与整体函数相同的类型。因此,如果您将函数更改为reuturn (count, list)
,则递归调用也将返回该函数。
通常,您希望收集返回的值并从中计算新值。
现在你有这个:
removeI (y :: t1)
但你需要更像这样的东西:
let (count, list) = removeI (y :: t1) in
(* Newly calculated count and list *)
请注意,您的基本案例还必须返回一个计数和一个列表。
作为旁注,我实际上并不理解你的第二个基本案例。如果它是列表中唯一的内容,您不想删除'i'
吗?这似乎并不特别一致。