以下Agda代码是非法的:
record F : Set where
field
A : Set
a : (F : Set) → Set
a f with A
a f | x = x
where open F f
这是一个人为的例子,展示了where
中引入的绑定在with
子句中的用法。即使是人工的,也有更大的例子,这是可取的。
为什么这是非法的原因似乎是with
可以导致参数由于统一而被更大的术语替换。特别是早期绑定在with
结果匹配的子句中可能不可用。这是一个适用于任何解决方案的警告。
有没有办法模仿或简化这样的功能,假设传递给with
的表达式实际上足够长,足以证明这种努力的合理性?
答案 0 :(得分:1)
您可以使用let
:
record F : Set₁ where
field A : Set
a : F -> Set
a f with let open F f in A
a f | x = x
对于嵌套的with
,您可以使用辅助功能:
record F : Set₁ where
field A : Set
a : F -> Set
a f = a' where
open F f
a' : Set
a' with A | A
a' | x | _ with A
a' | x | _ | _ = x
不是很好,但有效。