'让'在记录望远镜中

时间:2014-08-19 17:42:47

标签: record let agda

在Agda记录望远镜内是否允许使用letwhere子句,以便在望远镜中引入局部定义?

This discussion表明以下内容应该是合法的:

record _×_ (let ⋆ = Set) (A B : ⋆) : Set where
   constructor _,_
   field
      fst : A
      snd : B

This change request描述了略有不同的语法:

record _×_ (let ⋆ = Set in (A B : ⋆)) : Set where
   constructor _,_
   field
      fst : A
      snd : B

(问题标记为已接受,似乎有补丁,但我不知道它是否已正式合并。)

然而,Agda 2.4.0.2并不接受其中任何一种。

结肠后我似乎可以像我期望的那样使用let

record _×_ (A B : Set) : let ⋆ = Set in ⋆ where
   constructor _,_
   field
      fst : A
      snd : B

是否有某些原因我可以在记录声明的望远镜部分使用let(在给出其索引时),但在给出其参数时却没有?

2 个答案:

答案 0 :(得分:2)

从2.4.0的发行说明:

  • Telescoping let:现在可以在望远镜中接受本地绑定 模块功能类型 lambda-abstractions

所以不,你提到的补丁还没有被合并。

您可以在最后一个代码段中使用let的原因是您在表达式中使用它。换句话说,声明的索引部分不是望远镜。

答案 1 :(得分:0)

以下是使用本地模块模拟let的方法:

private
   module Dummy (let ⋆ = Set) where
      record _×_  (A B : ⋆) : Set where
         constructor _,_
         field
            fst : A
            snd : B
open Dummy

更好的是,通过使用匿名模块,open Dummy可以省略:

module _ (let ⋆ = Set) where
   record _×_  (A B : ⋆) : Set where
      constructor _,_
      field
         fst : A
         snd : B

(如Agda 2.3.2 release notes中所述,后者基本上等同于前者。)