Ocaml模块实现

时间:2010-10-20 22:06:02

标签: ocaml

Ocaml的标准库包含各种模块:ListMapNativeint等。我知道提供了这些模块的接口(例如List module),但我对模块功能中使用的算法及其实现很感兴趣。

我在哪里可以找到它?

3 个答案:

答案 0 :(得分:19)


List实现很有意思。例如,map函数可以像这样实现:

let rec map f = function
  | [] -> []
  | a::l -> f a :: map f l

但是实现如下:

let rec map f = function
  | [] -> []
  | a::l -> let r = f a in r :: map f l

有什么区别?执行:

List.map print_int [1;2;3] ;;
map print_int [1;2;3] ;;

第一个打印123,但第二个打印321!由于f a的评估会产生副作用,因此强制执行正确的顺序非常重要。这就是官方地图实施的功能。实际上,evaluation order of arguments is unspecified in OCaml即使所有实现都遵循相同的顺序。

有关效果的考虑因素,请参阅Optimizing List.map post on the Jane Street blogList.map在小型列表中有效。)

答案 1 :(得分:5)

您可以在OCaml源代码中找到定义。例如,Map函数的实现位于OCaml源代码分发中的stdlib/map.ml

答案 2 :(得分:4)

它们应该已经安装在您的系统上。最有可能(假设是Unix系统),它们位于/ usr / lib / ocaml或/ usr / local / lib / ocaml中。只需打开任何.ml个文件。