2017-07-21 5 views
0

私はval remaining : char list -> int * char list = <fun>という署名を必要とするプロトタイプremaining thelistの関数を使って作業しています。私はOcamlを初めて学んだので、Ocaml関数をリストに入れてintとlistの両方を出力する方法を理解できません。これは私が現在取り組んでいるコードです。OCamlとintのcharリストのペア

let rec remaining thelist= match thelist with 
    | [] -> [] 
    | [x] -> [x] 
    | x::y::t1 -> 
     if x='a' then remaining (y::t1) 
     else thelist;; 

match thelist with 
    | [] -> 0 
    | x::t1 -> 
    if x='a' then 1+remaining t1 
    else 0;; 

2番目のブロックをコメントアウトすると、最初のコードブロックが正しいcharリストを出力します。 2番目のブロックは、最初のブロックをコメントアウトすると正しいintを出力します。私はどのように互換性のエラーの種類なしで、目的の署名を達成するためにコードを組み合わせるには手がかりがありません。

+0

これは別の質問の重複のようです:https://stackoverflow.com/質問/ 45228064/ocaml-count-連続要素のリスト –

+0

@JeffreyScofield Hm ...しかし、2つの引数を取る関数を変更しないと、署名がint * char list - > int * char listに変更されます? – Userc9l

+1

入力パラメータの変更を提案する人は誰もいません。本質的には、キーは再帰呼び出しの結果を破棄することです。 –

答えて

0
あなたは(実際にあなたの署名のアドバイスあなたがそうする)と「隠れた」地元の機能を製品タイプを使用することができます

let remaining = 
    let rec f i = function 
     | 'a'::l -> f (i+1) l 
     | l -> i, l 
    in 
    f 0