我刚刚开始使用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;
| _ -> ()
)
| _ -> ()
我不明白为什么!我尝试了不同的东西,但没有任何效果!
答案 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>
因此,您可以在match
和with
之间添加任何表达式。在那里Str.split
是合理的。另一方面,模式受到限制。从本质上讲,它们就像复杂的常量值。它们还可以包含由匹配定义的“通配符”名称,即它们被设置为在该点匹配的值的一部分。但是你在模式中永远不会有Str.split
或String.concat
。对于这样的基础知识,最好阅读有关OCaml的书籍或教程。
答案 1 :(得分:0)
您似乎使用match with
进行比较。为此,您必须使用if then else
。