Agda类型错误
我是Agda的新手,我正在尝试定义一个常量Agda类型错误,agda,Agda,我是Agda的新手,我正在尝试定义一个常量prod,类型为: Z→ (Z)→ ((Z)→ (套)→ 设置)的值。 现在,我已经编写了以下Agda代码: data Prod (X : Set) : ℕ → X where prod : ℕ → (ℕ → ((ℕ → X) → X)) 当我键入check it时,agda生成以下错误消息: X != Set (_33 X_) of type Set when checking the definition of Prod 非常感谢您的帮助您
prod
,类型为:
Z→ (Z)→ ((Z)→ (套)→ 设置)的值。
现在,我已经编写了以下Agda代码:
data Prod (X : Set) : ℕ → X where
prod : ℕ → (ℕ → ((ℕ → X) → X))
当我键入check it时,agda生成以下错误消息:
X != Set (_33 X_) of type Set
when checking the definition of Prod
非常感谢您的帮助您的数据类型定义有两个问题。首先,所有数据类型都在
集合中(在某种级别上),您不能只是将数据类型声明为其他类型的元素
data T : ℕ where
这个定义试图假设自然数还有另一个元素,即T
。那没有多大意义。唯一可以添加更多元素的“类型”是Set
——所有(小型)类型的类型。(我在掩饰一个事实,那就是有一个无限层次的Set
s,你现在不需要处理这个问题)
所以这没关系:
data T : Set where
定义的第二个问题是prod
构造函数的类型没有反映出它真正构造了prod
类型的东西。构造函数的要点是,它们可以是您正在定义的类型的元素
让我们看看自然数的定义:
data ℕ : Set where
zero : ℕ
suc : ℕ → ℕ
当我们写zero时:ℕ代码>,我们是说零
是一个自然数。如果我们换成这个呢:
data ℕ : Set where
zero : String
suc : ℕ → ℕ
我们定义的是自然数,我们定义零
是一个字符串
?因此,因为我们定义的是构造函数,所以我们给它的类型必须提到我们在最后一个位置定义的类型。(这一提及也可以是间接的)
您可以在冒号的左边添加参数,但不能在构造函数中更改这些参数。例如,这是无效的:
data T (A : Set) : Set where
t : T ℕ
请注意,T
本身是不够的——它不是一个类型,而是一种从类型到类型的函数(即Set)→ 设置
)。这个没问题:
data T (A : Set) : Set where
t : T A
冒号右边是索引。这些类似于参数,只是您可以在构造函数中选择值。例如,如果我们有一个按自然数索引的数据类型,例如:
data T : ℕ → Set where
您可以使用如下构造函数:
data T : ℕ → Set where
t₀ : T zero
t₁ : T (suc zero)
很像上面提到的,T
本身并不是一种类型。在这种情况下,它是一个函数ℕ → 设置
无论如何,回到你的代码。如果您的意思是Prod
包含一个ℕ → (ℕ → ((ℕ → 十)→ 十) )
,则应为:
data Prod (X : Set) : ℕ → Set where
prod : (ℕ → (ℕ → ((ℕ → X) → X))) → Prod X zero
但是,我不知道您使用索引的目的是什么。您的数据类型定义有两个问题。首先,所有数据类型都在集合中(在某种级别上),您不能只是将数据类型声明为其他类型的元素
data T : ℕ where
这个定义试图假设自然数还有另一个元素,即T
。那没有多大意义。唯一可以添加更多元素的“类型”是Set
——所有(小型)类型的类型。(我在掩饰一个事实,那就是有一个无限层次的Set
s,你现在不需要处理这个问题)
所以这没关系:
data T : Set where
定义的第二个问题是prod
构造函数的类型没有反映出它真正构造了prod
类型的东西。构造函数的要点是,它们可以是您正在定义的类型的元素
让我们看看自然数的定义:
data ℕ : Set where
zero : ℕ
suc : ℕ → ℕ
当我们写zero时:ℕ代码>,我们是说零
是一个自然数。如果我们换成这个呢:
data ℕ : Set where
zero : String
suc : ℕ → ℕ
我们定义的是自然数,我们定义零
是一个字符串
?因此,因为我们定义的是构造函数,所以我们给它的类型必须提到我们在最后一个位置定义的类型。(这一提及也可以是间接的)
您可以在冒号的左边添加参数,但不能在构造函数中更改这些参数。例如,这是无效的:
data T (A : Set) : Set where
t : T ℕ
请注意,T
本身是不够的——它不是一个类型,而是一种从类型到类型的函数(即Set)→ 设置
)。这个没问题:
data T (A : Set) : Set where
t : T A
冒号右边是索引。这些类似于参数,只是您可以在构造函数中选择值。例如,如果我们有一个按自然数索引的数据类型,例如:
data T : ℕ → Set where
您可以使用如下构造函数:
data T : ℕ → Set where
t₀ : T zero
t₁ : T (suc zero)
很像上面提到的,T
本身并不是一种类型。在这种情况下,它是一个函数ℕ → 设置
无论如何,回到你的代码。如果您的意思是Prod
包含一个ℕ → (ℕ → ((ℕ → 十)→ 十) )
,则应为:
data Prod (X : Set) : ℕ → Set where
prod : (ℕ → (ℕ → ((ℕ → X) → X))) → Prod X zero
但是,我不知道您对索引的意图是什么。回到我的问题,我想定义某种缩写或一个表示这种类型的常量。现在我已经阅读了你的答案,我意识到一个新的数据类型不能完成这项工作。。因此,我想到了函数,并编写了以下代码,它是有效的:prod={X:Set}→ ℕ → (ℕ → ((ℕ → 十)→ 十) )但如果我想用它来定义,我不知道如何使用它lemmas@ymmagdi:因为类型是Agda中的第一类,所以可以使用函数获取和返回类型,所以这确实是可能的。请看Op₂例如,上面的代码>函数。至于如何使用它——好吧,如果不知道你想做什么,很难说;如果你陷入困境,请考虑问另一个问题(这比在评论中处理好),我来看看我能不能帮助。回到我的问题,我想定义一些缩写词或一个常量来引用这个类型。现在我已经阅读了你的答案,我意识到一个新的数据类型不能完成这项工作。。因此,我想到了函数,并编写了以下代码,它是有效的:prod={X:Set}→ ℕ → (ℕ → ((ℕ → 十)→ 十) )但是我不知道怎么做