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
如果你真的想要的话。
我无法理解这个语法。我没有在 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
如果你真的想要的话。