编写main()来调用函数

时间:2016-03-20 20:55:55

标签: ocaml

我有一个将字符串转换为数组的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

1 个答案:

答案 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

或者,使用beginend使优先级更加清晰:

let patArray = Array.create (String.length pattern) 0 in begin
  createArray pattern patArray;
  Array.iter ~f:(printf "%d ") patArray
end

如果没有;,解析器就不会知道下一行的Array.iter是否应该是createArray调用的附加参数。