gpt4 book ai didi

ocaml - OCaml在多态变体上的功能还不够多态吗?

转载 作者:行者123 更新时间:2023-12-04 13:24:06 27 4
gpt4 key购买 nike

OCaml将function `A -> 1 | _ -> 0的类型设置为[> `A] -> int,但是为什么不是[> ] -> int呢?

这是我的理由:

  • function `B -> 0具有类型[<`B] -> int。添加`A -> 0分支使其成为function `A -> 1 | `B -> 0可以将其松散到[<`A|`B] -> int。该函数在其可以接受的参数类型上变得更加宽松。这是有道理的。
  • function _ -> 0具有类型'a -> int。此类型无法通过[> ] -> int来实现,并且[> ]是已经打开的类型(非常允许)。添加`A -> 0分支使其成为function `A -> 1 | _ -> 0会将类型限制为[>`A] -> int。这对我来说没有意义。实际上,再添加一个分支`C -> 1将使其变为[>`A|`C] -> int,从而进一步限制了类型。为什么?

  • 注意:我不是在寻找解决方法,我只是想知道此行为背后的逻辑。

    在相关说明中, function `A -> `A | x -> x的类型为 ([>`A] as 'a) -> 'a,尽管这也是该参数的限制性开放类型,但我可以理解其原因。类型应该与 'a -> 'a[>` ] -> 'b'c -> [>`A]统一;唯一的方法似乎是 ([>`A] as 'a) -> 'a

    我的第一个示例是否存在类似的原因?

    最佳答案

    一个可能的答案是[> ] -> int类型将允许使用(`A 3)参数,但是function `A -> 1 | _ -> 0不允许使用该参数。换句话说,该类型需要记录`A不带参数的事实。

    关于ocaml - OCaml在多态变体上的功能还不够多态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10769001/

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