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

自RWO以来,OCaml编译器是否发生了巨大的变化?,ocaml,Ocaml,来自真实世界OCaml第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] E

来自真实世界OCaml第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
很明显,一些重大的变化,对吗?为什么这些例子不起作用?有更好的书可以学习吗


这种语言很棒,我想尽我所能学习,但资源匮乏。

尝试使用模块
列表标签
而不是
列表

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

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

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

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

不确定他们的在线顶级网站是怎么回事。

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

RWO使用一个名为“核心”的库。有一些区别,特别是
List.map
上的
f
标签。显然,你没有装上

在这本书的序曲中有一本关于如何设置一切的指南。 在顶层,您可以执行
#要求“核心”


另请参见和。

要使用Core和其他Janestreet库,您应该打开库的伞形模块。例如,对于标准库的替代品
Core
library,您需要使用

open Core.Std

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

我认为您问题的标题可能会被标记为非描述性:)您只需要
打开Core.Std
啊,我明白了,是的,我已经通过opam安装了Core。我想这就是我问题的根源,错误的列表函数。为什么他们要在JS核心库和标准库之间混合语法。它们至少应该显示导入路径的其余部分。这使得阅读这本书变得非常困难,有一个不同的cryptokit示例,他们甚至没有提到需要打开几次才能编译。我希望他们的意图更加明确。我会继续前进。谢谢。我想出来了——我的文件中也打开了电池,它混淆了js和电池映射功能。我可能应该明确地告诉它何时我将使用这两个函数。ocaml中是否有“open…as”指令来重命名我的导入?RWO似乎是一本好书,但我同意您的观点,即在针对初学者的部分中使用第三方库会带来麻烦。Jane Street Core采用了一些先进的技术,因此它是本书后面部分使用的最简单的单一库。不过,我认为最好在一开始就完全避免。我认为在第二节之前没有充分的理由使用它。我一时想不出一个好的替代方案——也许其他人有一个?是的,如果我理解正确,你可以做
module Foo=SomeOtherModule
。这很有效,谢谢。我还有其他问题,我会提出一个新问题。