【问题标题】:Did the OCaml compiler change drastically since RWO?自 RWO 以来,OCaml 编译器是否发生了巨大变化?
【发布时间】:2015-08-07 09:42:49
【问题描述】:

来自真实世界 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

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

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

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

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

【问题讨论】:

  • 我认为您的问题的标题可能会被标记为不具描述性:)
  • 你只需要open Core.Std

标签: ocaml


【解决方案1】:

尝试使用模块ListLabels 而不是List

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

Standard ListLabels

Standard List

Jane Street Core List

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

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

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

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

【讨论】:

  • 啊,我明白了,是的,我通过 opam 安装了核心。我想这是我的问题的根源,错误的列表功能。为什么他们在 JS 核心库和标准之间混合语法。它们至少应该显示导入路径的其余部分。这使阅读这本书变得非常困难,他们甚至没有提到cryptokit的一个不同示例,它需要打开几次才能编译。我希望他们的意图更清楚。嗯,我会继续前进的。谢谢。
  • 我想通了——我的文件中也打开了电池,它在 js 和电池映射功能之间变得混乱。当我打算使用任何一个功能时,我可能应该明确告诉它。 ocaml 中是否有“open...as”指令来重命名我的导入?
  • RWO 似乎是一本好书,但我同意你在面向初学者的部分中使用第三方库的烦恼。 Jane Street Core 结合了一些先进的技术,因此它是本书后面部分使用的最简单的单一库。不过,我认为最好在一开始就完全避免它。我认为在第二节之前没有充分的理由使用它。我想不出一个好的选择——也许其他人有一个?
  • 是的,如果我理解正确的话,您可以使用module Foo = SomeOtherModule
  • 成功了,谢谢。我有任何其他问题,我会提出一个新问题。
【解决方案2】:

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

RWO 使用一个名为“core”的库。有一些区别,特别是List.map 上的f 标签。显然,您没有加载它。

本书的前奏中有关于如何设置所有内容的指南。 在顶层,你可以#require "core"

另请参阅 core's documentationstdlib's documentation

【讨论】:

    【解决方案3】:

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

    open Core.Std
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多