为什么这种弱多态型


module type M = sig
  type ('k, 'v) t
  val foo : 'k -> ('k, 'v) t
end
module M : M = struct
  type ('k, 'v) t = ('k * 'v) list
  let foo k = []
end

在这个小例子中,为什么M.foo 123会有一个弱多态类型,(int, '_a) M.t)

我相信这是值限制。 M.foo 123不是一个值,而是一个函数应用程序。所以它不能有完全多态的类型。

实际上,您可以通过在模块类型中将'v声明为协变来解决此问题。我以前从未亲自尝试过这个,但它似乎确实有效:

# module type M = sig
  type ('k, +'v) t
  val foo: 'k -> ('k, 'v) t
  end;;
module type M = sig type ('k, +'v) t val foo : 'k -> ('k, 'v) t end
# module M: M = struct
  type ('k, 'v) t = ('k * 'v) list
  let foo k = []
  end;;
module M : M
# M.foo 123;;
- : (int, 'a) M.t = <abstr>

我相信这是有效的,因为"放宽价值限制"。

我从这里了解到方差注释的这种用法@gasche:放宽的值限制何时在 OCaml 中生效?

相关内容

  • 没有找到相关文章

最新更新