我正在尝试遵循McBride的How to Keep Your Neighbours in Order的代码,并且无法理解为什么Agda(我正在使用Agda 2.4.2.2)给出以下错误消息:
实例搜索只能用于查找命名类型中的元素 在检查表达式
时t
是否具有类型.T
表示函数_:-_
。代码如下所示
data Zero : Set where
record One : Set where
constructor <>
data Two : Set where tt ff : Two
So : Two -> Set
So tt = One
So ff = Zero
record <<_>> (P : Set) : Set where
constructor !
field
{{ prf }} : P
_=>_ : Set -> Set -> Set
P => T = {{ p : P }} -> T
infixr 3 _=>_
-- problem HERE!
_:-_ : forall {P T} -> << P >> -> (P => T) -> T
! :- t = t
非常感谢任何帮助。
答案 0 :(得分:4)
Nils Anders Danielsson最近在agda-dev邮件列表上发了一封电子邮件。我在网上找不到,所以这里有一个引用:
Conor在“如何保持邻居”中使用了大量实例参数 按顺序“。但是,他的代码是使用旧的变体编写的 实例参数,现在无法检查。我设法制作代码 再次使用一些小调整,并想知道我们是否可以逃脱 甚至更少:
我替换了
record One : Set where constructor it
与
record One : Set where instance constructor it.
这对我来说很好。
我替换了
_:-_ : forall {P T} -> <P P P> -> (P => T) -> T ! :- t = t
与
_:-_ : forall {P T} -> <P P P> -> (P => T) -> T ! {{prf = p}} :- t = t {{p = p}},
因为“实例搜索只能用于查找文件中的元素 命名类型“。同样,在两种情况下,我替换了模块参数
(L : REL P)
与
(L' : REL P) (let L = Named L'),
其中Named是命名类型系列:
data Named {P : Set} (A : REL P) : REL P where named : forall {x} -> A x -> Named A x