繁体   English   中英

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

[英]i have weird syntaxe error in ocaml code

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

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

正如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的书籍或教程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM