Que*_*det 19
/usr/lib/ocaml/list.ml
和其他.ml
文件.ml
文件https://github.com/ocaml/ocaml/tree/trunk/stdlibList实现很有意思.例如,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
在小型列表上有效).
归档时间: |
|
查看次数: |
5476 次 |
最近记录: |