Reason ML 中的整数类型和模块有哪些?

3

我试着使用Int32库编写一些代码,但是遇到了类型错误:

let x : int = 7;
Int32.abs(x)

This has type:
  int
But somewhere wanted:
  int32

我对此感到有些惊讶,因为在其他语言中,int 只是 int32 的别名。

我的问题是:

  • Reason ML 中有哪些整数类型?
  • 使用它们的指南是什么?
  • 是否有每个类型的模块?(例如,我注意到有 Int32.abs 但没有 Int.abs
1个回答

8
以下是各种整数数据类型的比较,包括它们的类型、关联模块和文字语法:

let int       : int       = Pervasives.abs(42);
let int32     : int32     = Int32.abs(42l);
let int64     : int64     = Int64.abs(42L);
let nativeint : nativeint = Nativeint.abs(42n);

请注意,Pervasives会自动打开,因此您无需像上面那样限定其函数。
在32位平台上,int本地为31位,在64位平台上为63位,除非需要int32int64nativeint提供的精确算术语义,否则应使用该类型。 In32Int64Nativeint都包含这个(或类似的)说明:

性能提示:类型为int32的值占用比类型为int的值更多的内存空间,并且对int32的算术运算通常比对int的算术运算慢。仅当应用程序需要精确的32位算术时才使用int32。

希望这回答了你的问题。 编辑:在使用BuckleScript编译为JavaScript时(这在Reason中很常见),语义略有不同:
  • int32int64的行为相同
  • int的行为类似于int32
  • nativeint大多像float一样处理,但有一些例外,更像整数。
来源:https://bucklescript.github.io/docs/en/difference-from-native-ocaml.html#integers

2
更正:在32位平台上,默认的int类型有31位,在64位平台上有63位。缺失的一位是GC所需的标记位,它使得无盒表示成为可能。 - Andreas Rossberg
确实,我认为你是对的,我已经更新了答案。谢谢!我从《OCaml for the Skeptical》中得到了这个30位数,显然我不应该相信它,但在手册中找不到任何相关信息。 - glennsl
@glennsl 啊,非常感谢提供链接。我本来以为在静态类型语言中不需要对基元使用类型标签,但似乎 Ocaml 比我想象的更加动态。 - Bergi
3
@Bergi,这与动态性无关,而是与具有所谓的“统一表示法”来表示所有值为单个词有关。这对于有效实现参数多态性非常重要,其中类型不是固定的。 - Andreas Rossberg
1
@Bergi,我明白了,但是在这个上下文中,“动态”通常意味着不同的东西,例如实际行为可以明显地取决于您获得的类型,而在这里表示仅是实现细节。静态特化仅适用于放弃一级多态性和模块化编译的情况,参见C ++。 - Andreas Rossberg
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接