Jac*_*ale 0 ocaml functional-programming
嗯,我有使用问题semicolon (single and double)和nested if elseOCaml中.
例如
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;;
Run Code Online (Sandbox Code Playgroud)
编译说 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?
问题是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;;
Run Code Online (Sandbox Code Playgroud)
编辑: '规则'实际上是OCaml中分号的定义.它分离返回的顺序表达式unit.之间的内容begin ... end是一个单一的表达.整个if表达式也是一个表达式,但由多个表达式组成.所以第一个陈述中包含的两个if陈述是,
if id_ary.(i) = p then begin ... end;
unionfy id_ary (i + 1)
Run Code Online (Sandbox Code Playgroud)