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;
                     | _ -> ()
        )

我在这里和这里有一个语法错误:| ["@@"; 行_已删除;行_添加;_] -> outlines_deleted;出线_添加;

                   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"

您需要使用 aif而不是 a 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.splitString.concat处于某种模式中。对于这样的基础知识,最好阅读有关 OCaml 的书籍或教程。

于 2013-06-10T13:57:13.363 回答
0

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

于 2013-06-10T10:09:11.753 回答