ハーバード CS 51 プログラミング コースのプログラミング課題を ocaml で解決しています。問題は、文字のリストをペアのリストに圧縮できる関数を定義することです。各ペアには、リスト内の文字と文字自体の結果的な出現回数が含まれます。つまり、この関数をリスト ['a' ;'a';'a';'a';'a';'b';'b';'b';'c';'d';'d';'d';'d'] 私たち[(5,'a');(3,'b');(1,'c');(4,'d')] のリストを取得する必要があります。この問題を解決するために、補助関数 go を使用する関数を思いつきました。
let to_run_length (lst : char list) : (int*char) list =
let rec go i s lst1 =
match lst1 with
| [] -> [(i,s)]
| (x::xs) when s <> x -> (i,s) :: go 0 x lst1
| (x::xs) -> go (i + 1) s xs
in match lst with
| x :: xs -> go 0 x lst
| [] -> []
私の質問は次のとおりです。補助関数 go を定義せずに、ネストされたパターン マッチングを使用して再帰関数 to_run_length を定義することは可能ですか。この場合、すでに渡された要素のカウンターの状態をどのように保存できますか?