在 Agda 中使用隐式参数

Using implicit parameters in Agda

我刚开始使用 Agda,并一直在关注 LearnYouAnAgda tutorial,其中向我展示了以下身份证明:

proof : (A : Set) → A → A
proof _ x = x

据我了解,_ 是省略参数 (A : Set) 所必需的。我想使用一个隐式参数来允许我省略 _:

-- using implicit parameter
proof' : {A : Set} → A → A
proof' x = x

这个证明有效。然后我想将它应用于特定案例,就像在教程中所做的那样。我定义 并给出我想要证明的类型签名:

data ℕ : Set where
  zero : ℕ
  suc : ℕ → ℕ

idProof : ℕ → ℕ

教程中使用proof给出的构造函数是:

idProof = proof ℕ

我不完全理解这一点,因为考虑到我们已经定义的构造函数,我预计 proof 需要 2 个参数。

我想使用 proof' 编写构造函数,但我发现以下 none 有效:

idProof = proof' ℕ
idProof = {x : ℕ} → proof' x
idProof = {x : Set} → proof' x

使用求解器,但我发现它有效:

idProof = proof' (λ z → z)

我的问题是:

  1. proofproof'有什么区别?

  2. 为什么对 proof 使用单个参数 是可以接受的?

  3. 为什么使用proof'的三个构造函数不起作用?

奖金:

如果能对 idProof = proof' (λ z → z) 的工作原理(尤其是 lambda)做一个简短的解释,我将不胜感激,除非它可能超出我目前对 Agda 的理解水平。

I don't fully understand this, since I expected proof would need 2 parameters considering the constructor we have already defined.

proof 确实需要 2 个参数。但是 idProof 也需要一个参数。

写的时候

idProof : ℕ → ℕ
idProof = proof ℕ

相当于先引入idProof,然后像这样传给proof ℕ

idProof : ℕ → ℕ
idProof n = proof ℕ n

I wanted to write a constructor using proof' but I found that none of the following worked:

  • idProof = proof' ℕ

proof'A 参数是隐含的。所以没有必要显式传递 。你可以只写 idProof = proof' 让 Agda 计算出 A 应该是 .

  • idProof = {x : ℕ} → proof' xidProof = {x : Set} → proof' x

idProofℕ → ℕ 类型,但 {x : _} → ... 用于构造 Set,不是函数,因此它无法工作。

Bonus: A small explanation of how idProof = proof' (λ z → z) works (esp. the lambda)

proof' : {A : Set} -> A -> A 试图找出 A 应该基于它的参数和它所使用的洞的类型。这里:

  • 它被传递了一个恒等函数,所以 A 对于某些 B;
  • 应该具有 B -> B 的形状
  • 它用于 ℕ → ℕ 类型的洞中,所以 A 应该是 ℕ → ℕ.
  • 的形状

结论:Agda 选择 ℕ → ℕ 作为 A