Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 公共Lisp中的类型类_Haskell_Common Lisp_Typeclass - Fatal编程技术网

Haskell 公共Lisp中的类型类

Haskell 公共Lisp中的类型类,haskell,common-lisp,typeclass,Haskell,Common Lisp,Typeclass,我想知道是否有办法在Common Lisp中模仿Haskell的TypeClass 泛型函数允许重载,并且可以使用deftype定义类型(例如,可以通过实例列表的成员身份来定义) 但是我不能在类型上分派。有没有一种方法可以使一个类在定义后成为其他类的子类(和子类型)(例如,使cons类成为序列类的子类,而无需重新定义cons) 谢谢。Haskell中的类型类是静态查找字典形式的“接口”实现的一种手段(类似于使用C++中的VTABLE,但几乎完全静态),不像在运行时动态调度的C++。然而,Comm

我想知道是否有办法在Common Lisp中模仿Haskell的
TypeClass

泛型函数允许
重载
,并且可以使用
deftype
定义类型(例如,可以通过实例列表的成员身份来定义)

但是我不能在类型上
分派
。有没有一种方法可以使一个类在定义后成为其他类的子类(和子类型)(例如,使
cons
类成为
序列
类的子类,而无需重新定义
cons


谢谢。Haskell中的类型类是静态查找字典形式的“接口”实现的一种手段(类似于使用C++中的VTABLE,但几乎完全静态),不像在运行时动态调度的C++。然而,CommonLisp是一种动态类型的语言,因此这种查找毫无意义。但是,您可以在运行时实现自己对“类型类”实现(实例)的查找——在像Common Lisp这样的语言中,这种设计不难想象


p.S.Python的Zope有一个具有非常相似特性的自适应机制,如果您想在动态环境中引用现有的解决方案的话

您不能按照设想的方式修改类层次结构,但可以实现几乎相同的效果

假设
序列
的定义是它有一个函数
序列长度
的方法

(defclass sequence ...)
(defmethod sequence-length ((s sequence)) ...)
然后,您可以轻松地将
序列长度
方法扩展到conses:

(defmethod sequence-length ((s cons))
    (length s))

这是否创建了一个包含
cons
的新类?不是真的。你可以通过说
(或sequence cons)
来表达具有
序列长度
方法的事物类型,但这并不是真正有用的。

Stackoverflow最适合于实际的编程问题,如果编程语言a可以支持编程语言B的功能,那么对于推测就不太好了。我在这里犹豫了,我认为这真的不仅仅是一个问题,而且是一个如何实现这样一个特性的问题(这是一个编程问题,不是吗?)。无论如何,我会记住的。我想知道Lisp是否能做到。即使Lisp是否可以像Haskell一样无关紧要,Lisp是否可以做类型类也是一个合理的问题。Haskell的实例字典并不比C++的vtables更静态。如果可能的话,它们在编译时进行专门化,但在运行时确实会传递。在运行时传递,但没有动态查找,因为没有动态调度,因为没有子类型多态性,也就是(类型)继承-我错过了什么吗?我不确定。这个术语似乎有点模糊。在多态递归(即使在Haskell 98中)或GADT(在真实的Haskell中)的存在下,特定类型可能不可知,特定实例可能不完全存在,直到运行时。这不是动态调度的本质吗?我可能经验不足:你能举个例子吗?我想学习。另外,如果你说的是真的,那不意味着Haskell有RTTI,并且没有完成运行时类型擦除吗?