【问题标题】:How to write the function `compare : 'a -> 'a -> int` in OCaml?如何在 OCaml 中编写函数`compare : 'a -> 'a -> int`?
【发布时间】:2014-02-28 15:38:08
【问题描述】:

嗯,这个问题的标题自己解释了。

Pervasives 中,compare 函数是外部的。

如果我被要求在 OCaml 中实现这样的功能怎么办?那可能吗?

【问题讨论】:

  • 仅使用Obj.magic
  • @nlucaroni 你是什么意思? Obj.magic 也是外部的
  • 在我看来,最好的答案是不可能。 (注意:Obj.magic 并不是一个真正的函数;它不生成任何代码。因此很难说它是外部的。但 Obj.magic 不是 OCaml 的一部分,或者无论如何这是我的主张。)
  • @JeffreyScofield 我想您可以将您的评论转换为答案。我也看了github.com/MassD/ocaml/blob/master/stdlib/obj.ml,好像是外部的,不是吗?
  • 虽然我提到过,但我同意 JeffreyScofield 的观点。 Obj.magic 不是一个合适的解决方案。 @JacksonTale,Obj 模块是标准库的一部分,但使用它是不好的做法。

标签: ocaml


【解决方案1】:

这是不可能的。

我们不能在 OCaml 中实现既是多态又检查与类型参数对应的数据的函数。 Obj 模块可以使这成为可能,但它“不是 OCaml 语言的一部分”(X. Leroy)。

Pervasives.compare 是用 C 语言实现的,并且可以使用 Obj 模块类似地实现。它依赖于 OCaml 值的运行时表示,因此无法在没有额外标记的情况下基于每种类型自定义顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多