好吧,我在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
的更多信息吗?
这是我心中的一些问题:
single semicolon
?如果我将它用于多个表达式,我是否必须在最后一个表达式后添加double semicolon
?我可以在begin end
内使用多个nested if
吗?
如果结果为else
,我似乎无需添加unit and do nothing
?
答案 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)