\ forall(∀)在签名中实际意味着什么?

时间:2013-12-08 23:04:35

标签: agda dependent-type

根据我收集的有关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)

很好。任何人都可以为我解决这个问题吗?

1 个答案:

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

ab的类型为Level;这称为宇宙多态性。