什么是谓词调度
|
最近,我在Clojure上看到了很多有关谓词分发的讨论,并且想知道这件事是否有事。换句话说,谓词调度是什么,它与泛型函数,OOP多态性和模式有何不同?
谢谢
没有找到相关结果
已邀请:
4 个回复
街茬
中,函数
是分派函数。 调度功能可能是
,在这种情况下,您将返回到类型调度。但是该功能可以做任何其他事情:计算调度值,在数据库中查找内容,甚至调出Web服务。 真正的谓词分派可能会允许每个方法实现指定一个或多个分派函数(谓词)来决定何时应用该方法。这比多方法更通用,但实现起来更复杂。 Clojure不支持它。 泛型函数是其他Lisps的术语。例如,Common Lisp提供了可以按类型分派的泛型函数以及一组受限制的其他函数。
郸身
辩谷变充
Clojure多方法为此增加了基于调度函数的返回值来调度到不同方法(可能是在不同名称空间中定义)的能力,该函数检查参数(可以包括参数的编号,类和值)并识别所有方法。正如斯图尔特·塞拉(Stuart Sierra)答案的脚注所指出的那样,多重方法的创建者可以定义调度功能,并且通常无法对其进行修改。另外,程序员必须为一个函数手动设计一个超复杂的调度函数,该函数对一个值为0的整数执行一个操作,对一个正整数执行一个操作。或一件事代表一个或多个项目的列表,另一件事代表一个空列表。 谓词分派将(也许)提供一种语法,该语法本身会生成此复杂的分派函数。例如,可以通过这种方式定义阶乘函数
前一个代码响应对的调用
后者编码为带有任何其他值的单个参数的调用。这将(在幕后)定义一个带有调度功能的多方法,该功能将零与其他值区分开。 但是稍后我可以通过编码来指定我想要一个阶乘(例如)
并且代码可以(理论上)拦截将地图传递给事实的调用,将其他调用委派给原始分派函数...全部在幕后。
目浆搽
并且,当您想要扩展它时,您无需指定调度值(因为没有派生fn来生成它),而是一个谓词:
简单而强大。 问题在于谓词可能重叠,而且您不想在每次调用时检查所有可能的谓词。这就是为什么实现会限制谓词的表达能力(类似于模式案例),以便能够对谓词保持精明(检测歧义,创建快速决策树等)。