Agda:如何使用 usual/curly 大括号相对于彼此以及“:”符号

Agda: How usual/curly braces are used relative to each other and to ':' sign

我无法理解这个语法。我没有在 Agda 教程手册中找到问题的答案。我发现的唯一一件事是 (x : A) -> (y : A) -> B 糖化为 (x : A)(y : A) -> B,糖化为 (x y : A) -> B,但这不是全部。

让我烦恼的是类型声明:

map : {A B : Set} -> (A -> B) -> List A -> List B

可以,而

map : {A B : Set} (A -> B) -> List A -> List B

不是。

参数之间带有箭头的版本

singleton : {A : Set} -> (x : A) → List A

很好,而没有箭头的相同表达式

singleton : {A : Set}(x : A) → List A

还好。

参数之间带有':'的版本

data _≡_  {a}{P : Set a} (x : P) : P → Set a where
  refl : x ≡ x

可以,而

data _≡_ :  ∀{a}{P : Set a} (x : P) →  P → Set a where
  refl :  x ≡ x

不是。

在 Haskell 中只有普通的大括号,每个大括号用箭头分隔。在 Agda 中有更多的语法糖,没有涉及到那么多。

while

data _≡_ :  ∀{a}{P : Set a} (x : P) →  P → Set a where
  refl :  x ≡ x

is not.

这个例子解析得很好;错误来自范围检查:

Not in scope:
  x at ...
when scope checking x

这个错误超出了这个问题的范围。不过,正如您似乎注意到的那样,_≡_ 的两个假定定义之间有很多相似之处: 符号告诉解析器接下来的内容应该解析为参数列表(就像在冒号属于 _≡_),但可以理解为 Curried 参数列表。 的主要实际用途是区分 x → P x∀ x → P x。前者脱糖为(_ : x) → P x(即x是一个类型),后者脱糖为(x : _) → P x(即x代表某个个体,推导出其类型来自 P).

的类型

我认为你的其他测试用例现在大部分都可以解决了。以下没有加糖形式,因为 A → B 参数没有给出名称。

What troubles me is that type declaration:

map : {A B : Set} -> (A -> B) -> List A -> List B

is fine, while

map : {A B : Set} (A -> B) -> List A -> List B

is not.

你可以这样写:

 map : {A B : Set} (f : A -> B) -> List A -> List B

 map : {A B : Set} (_ : A -> B) -> List A -> List B

如果你真的想要的话。