如何使用Ocaml分割主代码和其余代码?

如何使用Ocaml分割主代码和其余代码?,ocaml,oasis,Ocaml,Oasis,我想知道如何实现以下目标: 将所有“业务逻辑”保存在一个文件中 拥有一个使用该业务逻辑的main.ml 业务逻辑: type point = {x:float; y:float;} let pi_known = 3.141592653589793238462643383279502884197169399375105820974944592307816406286 let percentage_error pi_estimated = ((pi_known -. pi_estimat

我想知道如何实现以下目标:

  • 将所有“业务逻辑”保存在一个文件中
  • 拥有一个使用该业务逻辑的main.ml
业务逻辑:

type point = {x:float; y:float;}

let pi_known = 3.141592653589793238462643383279502884197169399375105820974944592307816406286

let percentage_error pi_estimated =
  ((pi_known -. pi_estimated) /. pi_known) *. 100.0

let pi_and_error pi error =
  Printf.sprintf "Pi's value :: %.10f Error rate :: %.10f %.%" pi error

let point_to_string { x = x; y = y } =
  Printf.sprintf "%.2f %.2f" x y

let gen_point xr yr =
  {x=xr; y=yr}

let distance_between_points p q =
  (p.x -. q.x) *. (p.x -. q.x) +. (p.y -. q.y) *. (p.y -. q.y)

let distance_from_origin c =
  distance_between_points c (gen_point 0.0 0.0)

let count_within ~counter:n =
  let rec count_within_aux ~counter:n ~within:m =
    match n, m with
      | 0, m -> m
      | n, m ->
        let cc = gen_point (Random.float 1.0) (Random.float 1.0) in
        let dist = distance_from_origin cc in
        match dist with
          | dist when dist <= 1.0 -> count_within_aux ~counter:(n - 1) ~within:(m + 1)
          | dist when dist > 1.0 -> count_within_aux ~counter:(n - 1) ~within:m
          | _ -> 0 in
  count_within_aux ~counter:n ~within:0

let count_within_stepping ~counter:n ~stepping:s =
  let rec count_within_stepping_aux ~counter:n ~within:m ~acc:acc =
    match n, m, acc with
      | n, m, acc when n <= 0 -> m
      | n, m, acc ->
          let c = count_within s in
          let pi = ((float_of_int m) /. (float_of_int acc)) *. 4.0 in
          let r = percentage_error pi in
          print_endline (pi_and_error pi r);
          count_within_stepping_aux ~counter:(n-s) ~within:(m+c) ~acc:(acc+s) in
  count_within_stepping_aux ~counter:n ~within:0 ~acc:0
main.ml:

let main () =
  Random.self_init();
  let num_iter = Sys.argv.(1) in
  let n = int_of_string num_iter in
  print_endline ("Number of iterations :: " ^ num_iter);
  let pi_estimated = ((float_of_int (Pi.count_within_stepping n (n / 20))) /. (float_of_int n)) *. 4.0 in
  let r = Pi.percentage_error pi_estimated in
  print_endline (Pi.pi_and_error pi_estimated r)

let () =
  main ()
_绿洲:

Name: Pi
Version: 0.1
Synopsis: Nope
Authors:
  Istvan <istvan@mail.tld>
License: MIT
Homepage: http://0.0.0.0
OASISFormat: 0.4
BuildTools: ocamlbuild
Plugins: META (0.4), DevFiles (0.4)
Executable "pi"
  Path: src
  MainIs: main.ml
  CompiledObject: best
  BuildDepends:
    str,unix
名称:Pi
版本:0.1
内容提要:没有
作者:
伊斯特万
执照:麻省理工学院
主页:http://0.0.0.0
OASISFormat:0.4
构建工具:ocamlbuild
插件:META(0.4)、DevFiles(0.4)
可执行“pi”
路径:src
MainIs:main.ml
编译对象:最佳
具体取决于:
str,unix
不幸的是,当我编译并运行它时,它不会返回任何结果,而如果我合并main.ml和pi.ml,它会按预期工作。我错过了什么

UPDTE:


在将mli文件添加到项目中并按照@gallais的建议更改main.ml后,它将按预期工作。

结果表明,mli文件是使用模块所必需的。需要具有src/x.ml和src/x.mli。如果存在这些文件,则可以从main.ml引用X。

结果表明,使用模块需要mli文件。需要具有src/x.ml和src/x.mli。如果存在这些文件,则可以从main.ml引用X。

尝试生成的输出是什么?对我来说,
ocamlbuild main很好。native
main
应该是一个函数(
let main()
…和
let()=main()
),但这不应该影响这里的结果。@etiennellon是的,我觉得这也很有趣。你能给我们看看你输入的编译和运行程序的命令吗?它们各自的输出是什么?@gallais它会生成,但当你运行它时,什么都不会发生。你尝试生成的输出是什么?对我来说,
ocamlbuild main很好。native
main
应该是一个函数(
let main()
…和
let()=main()
),但这不应该影响这里的结果。@etiennellon是的,我觉得这也很有趣。你能给我们看看你输入的编译和运行程序的命令吗?它们各自的输出是什么?@gallais它会生成,但当你运行它时,什么都不会发生
Name: Pi
Version: 0.1
Synopsis: Nope
Authors:
  Istvan <istvan@mail.tld>
License: MIT
Homepage: http://0.0.0.0
OASISFormat: 0.4
BuildTools: ocamlbuild
Plugins: META (0.4), DevFiles (0.4)
Executable "pi"
  Path: src
  MainIs: main.ml
  CompiledObject: best
  BuildDepends:
    str,unix