1

Caml を使い始めたばかりで、git ファイルを解析しようとしています。そのため、match を使用して diff/@@ で始まる行をフィルター処理しました。[「差分」; _; 前; 後] -> 前に; 後に出ます。

                 (match  Str.split (Str.regexp "/") file  with 
                     | String.concat "/" [_; path ; dest;file_c ]-> out path; 
                      out dest;
                      out file_c;
                     | _ -> ()
        )

こことここに構文エラーがあります。["@@"; lines_deleted; lines_added; _] -> out lines_deleted; アウトlines_added;

                   let   nb_lines_deleted = String.sub lines_deleted 2 ((String.length lines_deleted)-1) in
                     let  nb_lines_added = String.sub lines_added 2 ((String.length lines_added)-1) in
        ( match ( Str.split (Str.regexp ",") lines_deleted ) with 
                    | [_;  nb_lines_deleted;_; nb_lines_added] -> out nb_lines_deleted;
               out nb_lines_added;
                    | _ -> ()
                  )
           | _ -> ()

理由がわかりません!私はさまざまなことを試しましたが、何もうまくいきませんでした!

4

2 に答える 2

3

Thomash が言うように、match式のさまざまな選択肢は、定数とデータ コンストラクター (および本質的に「ワイルド カード」を表す名前) から構築されます。しかし、あなたはそこで一般的な表現を使おうとしています。

以下は、あなたがやろうとしていることと類似しています:

match x with
| a * b + 7 -> "case 1" (* Not a valid OCaml match *)
| _ -> "case 2"

一致が実際に機能する方法は次のとおりです。

match x with
| 1 -> "case 1"
| 2 -> "case 2"
| _ -> "case N"

ifの代わりにを使用する必要がありますmatch

if x = a * b + 7 then "case 1" else "case 2"

アップデート:

大まかに言えば、一致は次のようになります。

match <<any expression>> with
| <<pattern>> -> <<expression>>
| <<pattern>> -> <<expression>

matchしたがって、との間の任意の式を使用できますwith。そこにあるのは合理的Str.splitです。一方、パターンは制限されています。本質的に、それらは複雑な定数値のようなものです。また、一致によって定義される「ワイルドカード」名を含めることもできます。つまり、その時点で一致する値の一部に設定されます。しかし、あなたは決して持っStr.splitたりString.concat、パターンを持ったりすることはできませんでした. このような基本的な知識については、OCaml に関する本やチュートリアルを読むとよいでしょう。

于 2013-06-10T13:57:13.363 に答える