在 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)
我的问题是:
proof
和proof'
有什么区别?
为什么对 proof
使用单个参数 ℕ
是可以接受的?
为什么使用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' x
和 idProof = {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
。
我刚开始使用 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)
我的问题是:
proof
和proof'
有什么区别?为什么对
proof
使用单个参数ℕ
是可以接受的?为什么使用
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' x
和idProof = {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
; 应该具有 - 它用于
ℕ → ℕ
类型的洞中,所以A
应该是ℕ → ℕ
. 的形状
B -> B
的形状
结论:Agda 选择 ℕ → ℕ
作为 A
。