我想知道是否可以在Common Lisp中模拟Haskell的typeclasses
。
通用函数允许overloading
,并且可以使用deftype
定义类型(例如,可以通过某些实例列表的成员资格来定义)。
但我不能dispatch
一种类型。有没有办法在定义之后使类成为其他类的子类(和子类型)(例如,使cons
类成为sequence
类的子类,而不重新定义cons
)?
感谢。
答案 0 :(得分:2)
Haskell中的类型类是以字典形式静态查找“接口”实现的一种方法(类似于如何使用例如C ++中的vtables但是(几乎)完全静态地,与在运行时进行动态调度的C ++不同) 。然而,Common Lisp是一种动态类型语言,因此这种查找没有意义。但是,您可以在运行时实现自己的“类型类”实现(实例)查找 - 这种设计不像在Common Lisp中那样难以想象。
P.S。如果您想在动态设置中引用现有解决方案,Python的Zope具有非常相似的特性的自适应机制。
答案 1 :(得分:-1)
您无法以您想象的方式修改类层次结构,但您可以实现几乎相同的效果。
假设您对sequence
的定义是它有一个函数sequence-length
的方法。
(defclass sequence ...)
(defmethod sequence-length ((s sequence)) ...)
然后,您可以轻松地将sequence-length
方法扩展为conses:
(defmethod sequence-length ((s cons))
(length s))
是否创建了包含cons
的新类?并不是的。您可以通过说sequence-length
来表达具有(or sequence cons)
方法的内容类型,但这并不是真的有用。