Agda中实例参数的问题

时间:2015-03-13 00:20:41

标签: agda

我正在尝试遵循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

非常感谢任何帮助。

1 个答案:

答案 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