为什么这种弱多态类型?

时间:2014-09-11 22:42:00

标签: polymorphism ocaml value-restriction

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)

1 个答案:

答案 0 :(得分:2)

我相信这是价值限制。 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>

我相信这是因为"relaxed value restriction"

我在这里了解了@gasche的方差注释的使用:When does the relaxed value restriction kick in in OCaml?

相关问题