非递归ResolutionForInstanceArguments

请参见官方用户手册获取此页面上信息的最新版本。

总有机碳

注意:从Agda 2.4.2开始,实例搜索实际上是递归的(有关更多详细信息,请参阅更改日志:https://github.com/agda/agda/blob/maint-2.4.2/CHANGELOG#L128),如果列表等式boolEq(布尔等式)在中声明实例块,那么测试可以按预期编写。

如前所述,Agda解决方案未明确提供实例参数使用尝试选择的解决策略call-site作用域中唯一的type-correct值。这很重要要指出的是,这种解决策略的威力不如Haskell类型类的等效实例搜索。假设我们有以下定义:

 record Eq(t:Set):设置,其中
 字段==:t布尔

并且我们引入了记录函数的范围,将记录作为实例参数:

 开放模块EqWithImplicits{t:Set}{eqT:eqT}}=EqEqT

然后我们可以将以下等效的Haskell参数化类实例:

 listEq:{A:Set(设置)}等式A等式(列表A)
 listEq{A}eqA=记录{_==_=eq}其中
 等式:列表A列表A布尔
 eq[][]=真
 eq(a|as)(b|bs)=和(eq.eq eqA a b)(eq'as bs)
 等式_=假

然而,如果我们尝试使用此功能,Agda不会自动尝试应用此参数化实例以获取值等式t. The以下内容将导致类型错误,表示没有类型的值等式(列表Bool)在范围中找到:

 假设boolEq:Eq Bool
 test=(真/假/[])==[]

与Haskell不同,我们需要帮助Agda找到正确的实例:

 test=(真/假/[])==[]
 其中eqListBool=listEq boolEq

这种对实例检索权的限制引入以防止实例搜索被作为计算原语。然而,因此,Agda确实需要比Haskell更多的指导,可以在中找到正确的实例这种情况。

页面上次修改时间:2018年12月14日下午06:37
技术支持私人维基