在documentation of Clojure's type mechanisms中,声明
- 具体推导不好
- 您无法从具体类派生数据类型,只能从接口
派生数据类型
然而,一些core Clojure classes使用了具体的派生(还有其他例子,但这些是超类属于clojure.lang
的唯一情况):
ARef
扩展AReference
Agent
扩展ARef
Atom
扩展ARef
Namespace
扩展AReference
Ref
扩展ARef
Var
扩展ARef
此外,还有许多抽象类。但是,没有办法在Clojure中创建一个抽象类的等价物,对我来说,抽象类的扩展似乎具有与常规具体派生相同的缺点。
为什么在这里使用具体的推导?
答案 0 :(得分:3)
在谈到哲学的时候,我觉得自己不够权威,但这是我的两分钱。
您引用的文字出现在那里的原因是警告滥用defrecord
和deftype
。 Clojure不鼓励将记录/类型公开为API。相反,应尽可能公开接口。毕竟,OO语言公开类和FP语言公开函数/方法/接口。
另一方面,你提到clojure的实现本身使用抽象类并继承它们。我宁愿把它们视为“某人必须做的肮脏作品”。 JVM的设计使其在OO世界中的原语上最有效。 OO世界虚拟机和FP世界语言之间的差距必须由某人填补。