ocaml 多态变体类型 推断类型太笼统

标签 ocaml polymorphic-variants

我有这个代码

let my_fun: [`X | `Y | `Z] -> [`Z | `Y] = function
  | `X -> `Y
  | x -> x

它不会与消息一起编译
11 |   | x -> x
          ^
Error: This expression has type [ `X | `Y | `Z ]
       but an expression was expected of type [ `Y | `Z ]
       The second variant type does not allow tag(s) `X

为什么编译器不能推断类型 [Z | Y] 如果很清楚 `X 永远不能从函数中返回?

最佳答案

如果 x 的类型被推断为 [`Y | `Z] , 那么它不能用于类型 [`X | `Y | `Z]这会很奇怪,因为它绑定(bind)到该类型的参数。

您可以使用 as模式来获得具有精细类型的绑定(bind),如下所示:

let my_fun: [`X | `Y | `Z] -> [`Y | `Z] = function
  | `X -> `Y
  | (`Y | `Z) as yz -> yz
#type_name如果您想对许多情况下的多态变体执行此操作,模式可能非常有用。

关于ocaml 多态变体类型 推断类型太笼统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58867614/

相关文章:

ocaml - 结合参数多态性和多态变体(反引号类型)

c - 尽管轮询文件描述符,但不可靠的 http 客户端

data-structures - 一个菜鸟函数式程序员关于列表访问的问题

pattern-matching - 使用 GADT 建模语法,但类型参数无法统一

functional-programming - 在 F# 中模拟多态变体?

types - 变体定义中的多态变体限制

OCaml - 未绑定(bind)的记录字段

c - 在从 C 回调期间保护小堆上的指针

interface - OCaml 接口(interface)与签名?

ocaml - 如何使 Ocaml 多态变体私有(private)