Ocaml模块实现

Pet*_*ter 9 ocaml

Ocaml程序编写的标准库包含各种模块:List,Map,Nativeint等我知道这些模块的接口提供(例如对于列表模块),但我感兴趣的模块功能使用的算法及其实现.

我在哪里可以找到它?

Que*_*det 19


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

let rec map f = function
  | [] -> []
  | a::l -> f a :: map f l
Run Code Online (Sandbox Code Playgroud)

但是实现如下:

let rec map f = function
  | [] -> []
  | a::l -> let r = f a in r :: map f l
Run Code Online (Sandbox Code Playgroud)

有什么不同?执行:

List.map print_int [1;2;3] ;;
map print_int [1;2;3] ;;
Run Code Online (Sandbox Code Playgroud)

第一个打印123,但第二个打印321!由于评估f a可能产生副作用,因此强制执行正确的顺序非常重要.这就是官方地图实施的功能.实际上,即使所有实现遵循相同的顺序,OCaml中未指定参数评估顺序.

有关性能的考虑因素,请参阅Jane Street博客上Optimizing List.map帖子(List.map在小型列表上有效).


Mic*_*and 5

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