Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml模块实现_Ocaml - Fatal编程技术网

Ocaml模块实现

Ocaml模块实现,ocaml,Ocaml,Ocaml的标准库包含各种模块:List、Map、Nativeint,等等。我知道为这些模块提供了接口(例如用于),但我对模块功能中使用的算法及其实现感兴趣 在哪里可以找到它?您可以在OCaml源代码中找到定义。例如,Map函数的实现在OCaml源代码发行版的stdlib/Map.ml中。它们应该已经安装在您的系统上。很可能(假设是Unix系统)它们位于/usr/lib/ocaml或/usr/local/lib/ocaml中。只需打开任何.ml文件。 在您的系统上:/usr/lib/ocaml/

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


在哪里可以找到它?

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

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

  • 在您的系统上:
    /usr/lib/ocaml/list.ml
    和其他
    .ml
    文件
  • 在web上:和中的其他
    .ml
    文件

列表实现很值得研究。例如,
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
但实际上是这样实现的:

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的评估可能产生副作用,因此强制执行正确的顺序很重要。这就是官方map实现所做的。事实上,即使所有实现都遵循相同的顺序,结果也是一样的


有关性能方面的注意事项,请参见(
List.map
对小列表有效)。

竖起大拇指!(这是一篇博文,但我觉得它对初学者来说有点太神秘了:)有人能澄清第一种和第二种实现之间的区别吗?当我在OCaml和F#中运行它们时,我两个都收到123,从来没有收到321。因为这个答案已经有7年历史了,也许OCaml和F#已经发生了根本性的变化,但我对此表示怀疑?(我没有使用List.map,我正在测试两个自定义map函数)@gasche有什么想法吗?我可以重现这样一个事实,即
ignore(map print_int[1;2;3])
将使用
fa::map fli
版本的map为最新版本的OCaml打印321@jayphelps,您的测试设置可能有问题。@gasche谢谢!jayphelps提出了自己的问题,这引发了关于这个问题的更多讨论(特别是在评论中):