Ocaml 无法识别 else

问题描述

我对 Ocaml 比较陌生,遇到了一个烦人的错误。我的代码在这里

let rec nfa_to_dfa_step (nfa: ('q,'s) nfa_t) (dfa: ('q list,'s) nfa_t)
    (work: 'q list list) : ('q list,'s) nfa_t =
  match work with 
  | [] -> dfa
  | h::t -> 
    if (h <> []) then 
      (match nfa with { sigma; qs; q0; fs; delta } ->
        (let states = (new_states nfa h) in 
          (union states qs);
          (union states t);
          (union (new_trans nfa h) delta);
          (union (fold_left (fun acc state -> 
            let cur_final = (new_finals nfa state) in
            if (cur_final <> []) then (cur_final::acc) else acc) [] states) fs);
          (nfa_to_dfa_step nfa dfa t)));;
    else 
        (nfa_to_dfa_step nfa dfa t)

并且我在倒数第二行的 else 语句中遇到语法错误。我相当确定它与括号有关,需要在没有括号的地方放一些括号,但我已经在所有内容周围都加上了括号,并且我已经检查并仔细检查了不匹配的那些。如果我在整个 if else 语句周围加上括号,我会得到一个不同的错误

Error: Syntax error: ')' expected
File "src/nfa.ml",line 90,characters 4-5:
90 |     (if (h <> []) then
         ^
  This '(' might be unmatched

我做错了什么?关于如何调试此类错误的任何想法?因为我一直在用 ocaml 编程,所以我一直遇到这样的问题。作为习惯于命令式低级语言(如 C++)的人,任何有关如何解释和调试此类错误消息的建议将不胜感激。

解决方法

如前所述,;; 之后的 (nfa_to_dfa_step nfa dfa t))) 是罪魁祸首。 更细致地说,;; 不是无用的/语法上无效的,它用于结束“顶级短语”。例如:

(* say_hello is at toplevel *)
let say_hello x = 
  (* the body of the function is not *)
  let message = "Hello " ^ x ^ "!" in
  print_endline ()
;; (* here,;; is a terminaison for the function `say_hello`
      it is perfectly valid *)

为了避免混淆,我们可以在这里和那里阅读 ;; 仅在 REPL 中有用。在我看来,它对于错误报告很有用。但如果你不想担心,我建议你永远不要把它们放在上面,而是使用 OCamlformat 让它们为你放置它们。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...