gpt4 book ai didi

ocaml - 警告 40 : this record . .. 包含在当前范围内不可见的字段是什么意思

转载 作者:行者123 更新时间:2023-12-03 22:23:12 25 4
gpt4 key购买 nike

请考虑以下代码:

module A =
struct
type r = { i : int; s: string }
end

module B =
struct
type r = { i : int; s : string }
end


let f (x : A.r) : B.r = match x with
{ i; s } -> { i = 2*i; s = "" }

两个模块定义完全相同的记录。函数 f 将 A 记录转换为 B 记录。该警告已在编译期间发出,但也可以交互显示。在 ocaml cli 上,似乎调用 f 做了预期的事情:
# let x = f { i = 5; s = "ab" };;
Characters 10-29:
let x = f { i = 5; s = "ab" };;
^^^^^^^^^^^^^^^^^^^
Warning 40: this record of type Shadow.A.r contains fields that are
not visible in the current scope: i s.
They will not be selected if the type becomes unknown.
val x : Shadow.B.r = {Shadow.B.i = 10; s = ""}

我在 lexifi.com 上找到了一篇博文这解释了问题和一些常见的 solutions .我不明白的是实际的错误信息:
  • 类型变得未知是什么意思?
  • 未选择字段是什么意思?
  • 并由上述两个结果:需要满足哪些条件才能忽略警告?
  • 最佳答案

    在这种情况下,记录的类型是已知的,因为您提供了注释。
    如果您删除了注释,则类型将变得未知并且代码的含义可能会改变。

    OCaml 的理念是添加和删除类型注释不应该影响程序的含义,因此会产生警告。

    您可以通过将相关字段纳入范围来避免此警告。对模块中定义的字段执行此操作 A需要打开 A将其内容纳入范围,或使用模块限定字段名称。例如:

    module A = struct ... end

    let test r = r.A.field

    let test2 r = let open A in r.field

    open A

    let test3 r = r.field

    关于ocaml - 警告 40 : this record . .. 包含在当前范围内不可见的字段是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29624950/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com