是否可以在不涉及 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
。
没有涉及ref
或partial application
的弱多态函数有什么写法吗?
【问题讨论】:
值得指出的是,值限制在任何地方都没有提到ref
。 ref
没有什么特别之处,除了(在宽松的值限制下)它在子类型方面是不变的。
ref
在 SML 中更为特殊,这是最初提出值限制的上下文。在 SML 中,记录是不可变的,只有 ref
s(和数组?)是可变的。因此很多关于值限制的讨论自然会涉及到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 -> 'a t
或create: some_type -> 'a t
形式的构造,因此无需实际向编译器证明即可创建它们,它们将具有指定的类型。
【讨论】:
以上是关于是否可以在不涉及 ref 或部分应用的情况下编写弱多态函数?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不使用外部后端的情况下编写 grafana 数据源插件?
我可以在不编写扩展的情况下编写 FlexBuilder 脚本吗?
在不使用 matlab 头文件和库的情况下编写 MAT 文件