Ocaml程序编写的标准库包含各种模块:List
,Map
,Nativeint
,等我知道的是,提供这些模块接口(例如用于List module),但我感兴趣的模块使用的算法及其实现' 功能。Ocaml程序编写模块实现
我在哪里可以找到?
Ocaml程序编写的标准库包含各种模块:List
,Map
,Nativeint
,等我知道的是,提供这些模块接口(例如用于List module),但我感兴趣的模块使用的算法及其实现' 功能。Ocaml程序编写模块实现
我在哪里可以找到?
您可以在OCaml源代码中找到定义。例如,在OCaml源代码分发中,Map
函数的实现位于stdlib/map.ml
中。
它们应该已经安装在您的系统上。很可能(假设是Unix系统)它们位于/ usr/lib/ocaml或/ usr/local/lib/ocaml中。只需打开.ml
文件中的任何一个。
/usr/lib/ocaml/list.ml
等.ml
文件.ml
文件https://github.com/ocaml/ocaml/tree/trunk/stdlib列表实现有趣的研究。例如,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
对小型列表有效)。
竖起大拇指! (这里是博客文章,但我觉得它对于初学者来说有些过于神秘:http://ocaml.janestreet.com/?q=node/71) – gasche 2010-10-21 07:53:20
任何人都可以澄清第一个和第二个实现之间的区别?当我在OCaml和F#中运行它们时,我得到了123两个,从来没有321.因为这个答案是7岁,也许OCaml和F#从根本上改变了,但我怀疑它? (我没有使用List.map,我正在测试两个自定义地图函数) – jayphelps 2017-05-10 01:37:37
@gasche任何想法? – 2017-05-10 05:41:02