OCaml count consecutive elements in a list

倖福魔咒の 提交于 2020-01-06 04:30:27

问题


I'm writing OCaml code that reads in a list and removes any char 'i's that appear at the beginning of the list. For instance, the list removeI['i';'i';'a';'c';'i'] should return -: int * char list = ['a';'c';'i'], because there are 2 'i's at the beginning of the list. I believe I know how to implement this properly; however, I want to return a tuple that includes the number of removed 'i's as well as the new list with the 'i's removed. I know that may sound confusing, but an example would be removeI['i';'i';'a';'c';'i'] -: int * char list = (2,['a';'c';'i']) There are 2 'i's removed and the new list with the removed 'i's.

So far, I have the following function:

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

This returns the list with the first 'i's removed, but I keep getting errors when I try to include the number of removed 'i's as part of a tuple. Could anyone push me in the right direction? Thanks!


回答1:


Your recursive call will return the same type as the function overall. So if you change the function to reuturn (count, list), then the recursive call will return that also.

Generally you want to gather up the returned values and calculate a new value from them.

Right now you have just this:

removeI (y :: t1)

But you need something more like this:

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

Note that your base cases also have to return a count and a list.

As a side comment, I don't actually understand your second base case. You don't want to remove an 'i' if it's the only thing in the list? That doesn't seem particularly consistent.



来源:https://stackoverflow.com/questions/45228064/ocaml-count-consecutive-elements-in-a-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!