我只是在阅读Dependent Types at Work。在参数化类型的介绍中,作者在本声明中提到了
data List (A : Set) : Set where
[] : List A
_::_ : A → List A → List A
List
的类型为Set → Set
,A
成为两个构造函数的隐式参数,即。
[] : {A : Set} → List A
_::_ : {A : Set} → A → List A → List A
好吧,我试着稍微改写一下
data List : Set → Set where
[] : {A : Set} → List A
_::_ : {A : Set} → A → List A → List A
遗憾地无法工作(我正在尝试学习Agda两天左右,但是从我收集的内容开始,因为构造函数在Set₀
上进行了参数化,所以List A
必须在Set₁
)。
确实,接受以下内容
data List : Set₀ → Set₁ where
[] : {A : Set₀} → List A
_::_ : {A : Set₀} → A → List A → List A
然而,我不再能够使用{A : Set} → ... → List (List A)
(这是完全可以理解的)。
所以我的问题是:List (A : Set) : Set
和List : Set → Set
之间的实际差异是什么?
感谢您的时间!
答案 0 :(得分:14)
我冒昧地重命名数据类型。第一个是
Set
上的索引将被称为ListI
,第二个ListP
,
将Set
作为参数:
data ListI : Set → Set₁ where
[] : {A : Set} → ListI A
_∷_ : {A : Set} → A → ListI A → ListI A
data ListP (A : Set) : Set where
[] : ListP A
_∷_ : A → ListP A → ListP A
在数据类型中,参数在冒号之前,参数在之后 冒号被称为指标。构造函数可以在同一个中使用 方式,您可以应用隐式集:
nilI : {A : Set} → ListI A
nilI {A} = [] {A}
nilP : {A : Set} → ListP A
nilP {A} = [] {A}
模式匹配时会出现差异。对于索引版本,我们有:
null : {A : Set} → ListI A → Bool
null ([] {A}) = true
null (_∷_ {A} _ _) = false
ListP
-- does not work
null′ : {A : Set} → ListP A → Bool
null′ ([] {A}) = true
null′ (_∷_ {A} _ _) = false
错误消息是
The constructor [] expects 0 arguments, but has been given 1
when checking that the pattern [] {A} has type ListP A
ListP
也可以使用虚拟模块定义,如ListD
:
module Dummy (A : Set) where
data ListD : Set where
[] : ListD
_∷_ : A → ListD → ListD
open Dummy public
也许有点令人惊讶,ListD
等于ListP
。我们无法模仿
匹配Dummy
的参数:
-- does not work
null″ : {A : Set} → ListD A → Bool
null″ ([] {A}) = true
null″ (_∷_ {A} _ _) = false
这会给出与ListP
相同的错误消息。
ListP
是参数化数据类型的一个示例,它更简单
比ListI
,这是一个归纳家庭:它“取决于”
虽然在这个例子中以一种微不足道的方式表达了。
参数化数据类型在the wiki上定义, 和 here 是一个小介绍。
归纳家族并未真正定义,但在the wiki中详细阐述 与一些似乎需要归纳的典型例子 家族:
data Term (Γ : Ctx) : Type → Set where
var : Var Γ τ → Term Γ τ
app : Term Γ (σ → τ) → Term Γ σ → Term Γ τ
lam : Term (Γ , σ) τ → Term Γ (σ → τ)
忽略Type索引,不能简化这个版本
由于Dummy
构造函数而以lam
- 模式方式编写。
另一个好的参考是Inductive Families 作者:Peter Dybjer,1997年。
快乐的Agda编码!