在with中使用where-introduction bindings

时间:2014-10-20 13:35:54

标签: agda

以下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的表达式实际上足够长,足以证明这种努力的合理性?

1 个答案:

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

不是很好,但有效。