(重定向自参考手册。非正则隐式参数的非递归解析)
请参见官方用户手册获取此页面上信息的最新版本。
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):设置,其中
字段==:t→ t吨→ 布尔
我们引入了记录函数的范围,将记录作为实例参数:
开放模块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多一点指导来找到正确的实例这种情况。