我在ocaml代码中有奇怪的语法错误

时间:2013-06-10 08:44:29

标签: string filter ocaml match

我刚刚开始使用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;                         out 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;
                    | _ -> ()
                  )
           | _ -> ()

我不明白为什么!我尝试了不同的东西,但没有任何效果!

2 个答案:

答案 0 :(得分: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>

因此,您可以在matchwith之间添加任何表达式。在那里Str.split是合理的。另一方面,模式受到限制。从本质上讲,它们就像复杂的常量值。它们还可以包含由匹配定义的“通配符”名称,即它们被设置为在该点匹配的值的一部分。但是你在模式中永远不会有Str.splitString.concat。对于这样的基础知识,最好阅读有关OCaml的书籍或教程。

答案 1 :(得分:0)

您似乎使用match with进行比较。为此,您必须使用if then else