Ocaml的标准库包含各种模块:List
,Map
,Nativeint
等。我知道提供了这些模块的接口(例如List module),但我对模块功能中使用的算法及其实现很感兴趣。
我在哪里可以找到它?
答案 0 :(得分:19)
/usr/lib/ocaml/list.ml
和其他.ml
个文件.ml
个文件
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 blog(List.map
在小型列表中有效。)
答案 1 :(得分:5)
您可以在OCaml源代码中找到定义。例如,Map
函数的实现位于OCaml源代码分发中的stdlib/map.ml
。
答案 2 :(得分:4)
它们应该已经安装在您的系统上。最有可能(假设是Unix系统),它们位于/ usr / lib / ocaml或/ usr / local / lib / ocaml中。只需打开任何.ml
个文件。