Common Lisp中的类别类

时间:2015-06-04 07:20:38

标签: haskell common-lisp typeclass

我想知道是否可以在Common Lisp中模拟Haskell的typeclasses

通用函数允许overloading,并且可以使用deftype定义类型(例如,可以通过某些实例列表的成员资格来定义)。

但我不能dispatch一种类型。有没有办法在定义之后使类成为其他类的子类(和子类型)(例如,使cons类成为sequence类的子类,而不重新定义cons )?

感谢。

2 个答案:

答案 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)方法的内容类型,但这并不是真的有用。