在Agda记录望远镜内是否允许使用let
或where
子句,以便在望远镜中引入局部定义?
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
(在给出其索引时),但在给出其参数时却没有?
答案 0 :(得分:2)
从2.4.0的发行说明:
所以不,你提到的补丁还没有被合并。
您可以在最后一个代码段中使用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中所述,后者基本上等同于前者。)