我有一个将字符串转换为数组的OCaml函数。编写“main”函数来调用它并打印数组的规范方法是什么。
let createArray pattern patArray =
(* some unimportant way of setting all the elements in the array patArray
based on the string pattern *)
let main () =
let pattern = "Pattern" in
let patArray = Array.create (String.length pattern) 0 in
let res = createArray pattern patArray in
Array.iter ~f:(printf "%d ") patArray;; <------------------
main ()
1)在上面,如果我遗漏';;' , 这是行不通的。这有什么意义?
2)我可以以某种方式编写两个顺序执行的语句,而不是使用虚拟绑定“res”,如下所示:
createArray pattern patArray
Array.iter ~f:(printf "%d ") patArray
答案 0 :(得分:1)
如果没有;;
,解析器就无法知道该行之后的main ()
调用应该是一个独立的表达式(这里的空格不重要)。
您可以改为使用以下习语:
let main () = ...
let () = main ()
let () = expr
成语将在此时评估unit
类型的表达式。初始let
通知解析器新的顶级let
构造开始。使用;;
是告诉解析器有关顶级构造结束的另一种方法,但主要用于交互式使用。
为了按顺序评估两个表达式,请用分号分隔它们(如果您不确定优先级规则,请使用括号或begin ... end
)。例如:
let patArray = Array.create (String.length pattern) 0 in
createArray pattern patArray;
Array.iter ~f:(printf "%d ") patArray
或者,使用begin
和end
使优先级更加清晰:
let patArray = Array.create (String.length pattern) 0 in begin
createArray pattern patArray;
Array.iter ~f:(printf "%d ") patArray
end
如果没有;
,解析器就不会知道下一行的Array.iter
是否应该是createArray
调用的附加参数。