如何使用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