2010-10-20 59 views
9

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

我在哪里可以找到?

回答

5

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

4

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

19

列表实现有趣的研究。例如,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

竖起大拇指! (这里是博客文章,但我觉得它对于初学者来说有些过于神秘:http://ocaml.janestreet.com/?q=node/71) – gasche 2010-10-21 07:53:20

+0

任何人都可以澄清第一个和第二个实现之间的区别?当我在OCaml和F#中运行它们时,我得到了123两个,从来没有321.因为这个答案是7岁,也许OCaml和F#从根本上改变了,但我怀疑它? (我没有使用List.map,我正在测试两个自定义地图函数) – jayphelps 2017-05-10 01:37:37

+0

@gasche任何想法? – 2017-05-10 05:41:02