【问题标题】:Why this weakly polymorphic type?为什么是这种弱多态类型?
【发布时间】:2014-11-06 00:45:28
【问题描述】:
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)

【问题讨论】:

    标签: polymorphism ocaml value-restriction


    【解决方案1】:

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

    【讨论】:

    • 啊,超级有趣,我没想到要使用方差注释!
    猜你喜欢
    • 2014-02-11
    • 2019-12-23
    • 2016-08-16
    • 1970-01-01
    • 2013-07-20
    • 2015-01-01
    • 2018-12-29
    • 2013-05-29
    • 2012-03-18
    相关资源
    最近更新 更多