自RWO以来OCaml编译器是否发生了巨大变化?



来自Real World OCaml Page 60的例子

List.map ~f:((+) 3) [4;5;6;];;
Error: The function applied to this argument has type 'a list -> 'b list
This argument cannot be applied with label ~f

与RWO的HTML托管版本相同的示例

List.map ~f:((+) 3) [4;5;6];;
- : int list = [7; 8; 9]
Error: The function applied to this argument has type 'a list -> 'b list
This argument cannot be applied with label ~f

显然有些重要的变化,对吗?为什么这些例子不起作用呢?有更好的书可以学习吗?

这门语言太棒了,我想尽我所能学习,但资源稀缺。

尝试使用ListLabels模块代替List

这是一个关于标准库而不是编译器的问题,自RWO发布以来,这一点没有改变。RWO使用的是Jane Street Core,其功能与标准库中的ListLabels类似。特别是,ListLabels和简街核心Listmap的函数参数上都有一个标签f,而标准List没有。

标准ListLabels

标准列表

简街核心名单

在浏览器中搜索每个页面上的val map以查看函数签名。

可以从RWO代码顶部的语句# open Core.Std;;中看到RWO正在使用Jane Street Core。如果您想使用常规的标准模块List,请执行

List.map ((+) 3) [4;5;6];;

不知道他们的在线顶层是怎么回事。

不,没有任何改变。OCaml社区非常重视向后兼容性。:)

RWO使用一个名为"core"的库。有一些不同,特别是List.map上的f标签。显然,你没有加载它。

在这本书的前奏中有一个关于如何设置一切的指南。在顶层,您可以执行#require "core"

请参阅core的文档和stdlib的文档

为了使用Core和其他Janestreet库,您应该打开库的保护伞模块。例如,对于Core库(标准库的替代品),您需要使用

启动模块。
open Core.Std

这就是库的设计方式。你应该承认。此操作将为正确使用库准备环境。不要尝试使用任何技巧,比如将Core.Std绑定到其他模块或其他任何东西。

相关内容

最新更新