非递归ResolutionForInstanceArguments

(重定向自参考手册。非正则隐式参数的非递归解析)

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

TOC公司

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

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

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

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

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

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

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

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

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

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

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

实例搜索能力的这种限制是引入以防止实例搜索被作为计算原语。然而,因此,Agda确实需要比Haskell多一点指导来找到正确的实例这种情况。

页面上次修改时间:2018年12月14日下午06:37
由提供动力私人维基