【问题标题】:What are the integer types and modules in Reason ML?Reason ML 中的整数类型和模块是什么?
【发布时间】:2018-02-17 19:38:00
【问题描述】:

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

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

This has type:
  int
But somewhere wanted:
  int32

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

我的问题是:

  • Reason ML 中可用的整数类型有哪些?
  • 使用它们的准则是什么?
  • 每个都有一个模块吗? (例如,我注意到有Int32.abs,但没有Int.abs

【问题讨论】:

    标签: integer ocaml reason reasonml


    【解决方案1】:

    以下是可用的各种整数数据类型、它们的类型、相关模块和字面量语法的比较:

    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是自动打开的,所以你不需要像上面那样限定它的功能。

    ìnt 在 32 位平台上是 31 位的,在 64 位平台上是 63 位的,除非您需要 int32int64nativeintIn32Int64Nativeint 都包含这个(或类似的)注释:

    性能提示: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

    【讨论】:

    • 30 位整数(在大多数 CPU 上似乎需要自定义处理)如何比 32 位整数更快?
    • 更正:默认 int 类型在 32 位平台上为 31 位,在 64 位平台上为 63 位。缺少的位是 GC 所需的标记位,它启用了未装箱的表示。
    • 确实,我认为你是对的,我已经更新了答案。谢谢!我从“怀疑论者的 OCaml”中获得了 30 位数字,我显然不应该相信它,但在手册中找不到有关此的信息。
    • @Bergi,与动态无关,而是将所有值作为单个单词进行所谓的统一表示。这对于在类型不固定的情况下有效地实现参数多态性很重要。
    • @Bergi,我明白了,但在这种情况下,“动态”通常意味着不同的东西,例如实际行为可以明显取决于您获得的类型,而这里的表示只是一个实现细节。只有当您放弃一流的多态性和模块化编译时,静态特化才有效,请参阅 C++。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2011-07-06
    • 2014-06-14
    • 2019-08-06
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多