2017-07-21 6 views
0

私はリストを読み込んでリストの先頭に現れるすべてのcharを削除するOCamlコードを書いています。たとえば、リスト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 '私は削除され、削除された新しいリストは'私です。OCamlはリスト内の連続した要素をカウントします

これまでのところ、私は以下の機能を持っている:

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

これは最初にリストを返す「私が削除されますが、私は削除の数含めるしようとすると、エラーを得続ける」私はの一部としてですがタプル。誰かが正しい方向に私をプッシュできますか?ありがとう!

答えて

0

再帰呼び出しは、関数全体と同じ型を返します。だから、もしあなたが(count, list)を返すように関数を変更すると、再帰呼び出しはそれを返します。

一般的に、返された値を集めて、それらから新しい値を計算したいとします。

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

注お使いのベースの場合も、カウント、リストを返すことがあります。

removeI (y :: t1) 

しかし、あなたはより多くのこのようなものが必要:

は今、あなたはちょうどこの持っています。

サイドコメントとして、私は実際には2番目のベースケースを理解していません。リスト内の唯一のものなら、'i'を削除したくないですか?それは特に一貫していないようです。

関連する問題