分号和嵌套在OCaml中的表达式

时间:2013-02-07 17:17:54

标签: functional-programming ocaml

好吧,我在OCaml中使用semicolon (single and double)nested if else时遇到了问题。

例如


let union u p q = 
  let rec unionfy id_ary i =
    if i < Array.length id_ary then begin 
      if id_ary.(i) = p then begin 
        id_ary.(i) <- id_ary.(q);
        print_array id_ary 0;
      end
      unionfy id_ary (i + 1);
    end 
    else print_string "end of union";
  in
  unionfy u.id_ary 0;;

编译器说line 18, characters 29-95: Error: This expression is not a function; it cannot be applied

有问题的行是if id_ary.(i) = p then begin,但我不明白为什么。


此外,任何人都可以告诉我有关semicolon事物和nested if else的更多信息吗?

这是我心中的一些问题:

  1. 我何时使用single semicolon?如果我将它用于多个表达式,我是否必须在最后一个表达式后添加double semicolon
  2. 我可以在begin end内使用多个nested if吗?

  3. 如果结果为else,我似乎无需添加unit and do nothing

1 个答案:

答案 0 :(得分:5)

问题是end。在这种情况下,整个if表达式应该返回unit,因此在表达式的末尾需要一个分号。另一个end不需要它,因为if表达式继续else子句。下面,我删除了不必要的分号,并添加了剩余的分号,

let union u p q = 
  let rec unionfy id_ary i =
    if i < Array.length id_ary then begin 
      if id_ary.(i) = p then begin 
        id_ary.(i) <- id_ary.(q);
        print_array id_ary 0
      end;
      unionfy id_ary (i + 1)
    end 
    else print_string "end of union"
  in
  unionfy u.id_ary 0;;

编辑:“规则”实际上是OCaml中分号的定义。它分隔返回unit的顺序表达式。 begin ... end之间的内容是一个单数表达式。整个if表达式也是一个表达式,但由多个表达式组成。所以第一个if语句中包含的两个语句是

  if id_ary.(i) = p then begin ... end;
  unionfy id_ary (i + 1)