自RWO以来,OCaml编译器是否彻底改变了?

时间:2015-08-06 02:04:32

标签: ocaml

来自Real World 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

显然有些重大改变了吗?为什么这些例子不起作用?还有更好的书可供学习吗?

这种语言很棒,我想尽我所能,但资源很少。

3 个答案:

答案 0 :(得分:7)

尝试使用模块ListLabels代替List

这是关于标准库而不是编译器的问题,自RWO发布以来,这个问题没有改变。 RWO正在使用Jane Street Core,其功能类似于标准库中的ListLabels。特别是,ListLabels和Jane Street Core Listf的函数参数上都有一个标签map,而标准List则没有。{/ p >

Standard ListLabels

Standard List

Jane Street Core List

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

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

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

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

答案 1 :(得分:3)

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

RWO使用名为“core”的库。存在一些差异,尤其是case "How are you today": Console.WriteLine("I am good how are you?"); break; 上的f标签。显然,你没有加载它。

有关如何在本书前奏中设置所有内容的指南。 在顶层,您可以List.map

另请参阅core's documentationstdlib's documentation

答案 2 :(得分:0)

In order to use Core, and other Janestreet libraries you should open the umbrella module of the library. For example, for Core library, a substitute for a standard library, you need to start your module with

open Core.Std

This is how library is designed. You should admit it. This operation will prepare your environment for a proper use of the library. Do not try to use any tricks, like binding Core.Std to other module or anything else.