是否可以在不涉及 ref 或部分应用的情况下编写弱多态函数?

Posted

技术标签:

【中文标题】是否可以在不涉及 ref 或部分应用的情况下编写弱多态函数?【英文标题】:Is it possible to write a weakly polymorphism function without involving ref or partial application? 【发布时间】:2014-12-06 12:05:11 【问题描述】:
let remember =
   let cache = ref None in
    (fun x ->  match !cache with
         | Some y -> y
         | None -> cache := Some x; x)

是弱多态,但涉及ref

没有涉及refpartial application 的弱多态函数有什么写法吗?

【问题讨论】:

值得指出的是,值限制在任何地方都没有提到refref 没有什么特别之处,除了(在宽松的值限制下)它在子类型方面是不变的。 ref 在 SML 中更为特殊,这是最初提出值限制的上下文。在 SML 中,记录是不可变的,只有 refs(和数组?)是可变的。因此很多关于值限制的讨论自然会涉及到ref。当然在 OCaml 中,ref 只是具有可变字段的记录的一个实例。 【参考方案1】:

当然。模块抽象会做到这一点,本质上是指示编译器放弃所有关于实现的信息:

module Example : sig
  type 'a t
  val create : unit -> 'a t
end = struct
  type 'a t = int
  let create () = 0
end

以及弱多态结果:

# let x = Example.create ();;
val x : '_a Example.t = <abstr>

(注意,如果你想要多态性,你可以使用方差注释来恢复它。)

基于ref(数组、可变字段)以外的可变结构构建示例也很容易,但这并不是很有指导意义,因为它们几乎是一回事。

【讨论】:

【参考方案2】:

其他可变数据结构(如数组、bigarray、对象和其他结构)也可以使用create: unit -&gt; 'a tcreate: some_type -&gt; 'a t 形式的构造,因此无需实际向编译器证明即可创建它们,它们将具有指定的类型。

【讨论】:

以上是关于是否可以在不涉及 ref 或部分应用的情况下编写弱多态函数?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不使用外部后端的情况下编写 grafana 数据源插件?

我可以在不编写扩展的情况下编写 FlexBuilder 脚本吗?

在不使用 matlab 头文件和库的情况下编写 MAT 文件

如何在不涉及 Android 客户端应用程序的开发人员的情况下为某些网站构建公共/私有 API [关闭]

在不使用标准库的情况下编写 scipy 函数(指数幂)

在函数中,如何在不使用 ref 游标的情况下返回多个值?