根据我收集的有关agda的信息,我(显然是错误的)得出的结论是∀ {A}
等同于{A : Set}
。现在我注意到了
flip : ∀ {A B C} -> (A -> B -> C) -> (B -> A -> C)
无效(关于Set \ omega的东西,而这似乎是一些内部的东西,但
flip : {A B C : Set} -> (A -> B -> C) -> (B -> A -> C)
很好。任何人都可以为我解决这个问题吗?
答案 0 :(得分:6)
那是因为∀ {A}
实际上只是{A : _}
的语法糖,它要求编译器自动填充A
的类型。
这只适用于Set
s,因为您可以:
{A : Set}
{A : Set₁}
{A : Set₂}
-- etc.
事实上,所有这些都是定义中的有效类型。 ∀
实际上只有通过其使用才能明确地确定后续事物时才有意义。
例如,请考虑以下定义:
data List (A : Set) : Set where
-- ...
map : ∀ {A B} → (A → B) → List A → List B
map = -- ...
A
的类型必须为Set
,因为List
仅适用于Set
。
但是,因为它只是{A : _}
的糖,这意味着它的工作原理不仅仅是Set
。
_+_ : ℕ → ℕ → ℕ
_+_ = -- ...
comm : ∀ x y → x + y ≡ y + x
comm = -- ...
或者也许是最常见的用例:
map : ∀ {a b} {A : Set a} {B : Set b} → (A → B) → List A → List B
a
和b
的类型为Level
;这称为宇宙多态性。