我是依赖类型的新手,我对这两者之间的区别感到困惑。似乎人们通常会说某个类型是由另一个类型参数化,而由某个值索引。但是,依赖类型语言中的类型和术语之间没有区别吗?参数和指数之间的区别是否基本?你能告诉我在编程和定理证明中它们的含义不同的例子吗?
答案 0 :(得分:38)
当您看到一系列类型时,您可能想知道它所拥有的每个参数是参数还是 indices 。
参数仅表示该类型在某种程度上是通用的,并且对于所提供的参数,其行为参数化。
这意味着,例如,类型List T
将具有相同的形状,无论您考虑哪个T
:nil
,cons t0 nil
,{{1} cons t1 (cons t2 nil)
的选择只会影响T
,t0
,t1
可插入的值。
指数可能会影响您在该类型中找到哪些居民!这就是为什么我们说 index 是一个类型的家族,也就是说,每个索引都会告诉你正在查看哪一种类型(在类型族中)(在这个意义上,参数是一个退化的情况,其中所有索引都指向同一组“形状”。)
例如,类型系列t2
或有限的大小Fin n
包含非常不同的结构,具体取决于您选择的n
。
索引n
索引为空集。
索引0
索引具有一个元素的集合。
从这个意义上说,对指数价值的了解可能带有重要信息!通常,您可以通过查看索引来了解可能使用或未使用的构造函数。这就是依赖类型语言中的模式匹配可以消除不可行模式,并从触发模式中提取信息。
这就是为什么在定义归纳族时,通常可以定义整个类型的参数,但是你必须为每个构造函数指定索引(因为你可以为每个构造函数指定它所遵循的索引)在)。
例如,我可以定义:
1
此处,F (T : Type) : ℕ → Type
C1 : F T 0
C2 : F T 1
C3 : F T 0
是参数,而T
和0
是索引。当您收到1
类型的x
时,查看F T n
的内容将不会显示T
的任何内容。但是看x
会告诉你:
n
为x
时,C1
必须为C3
或n
0
为x
时,C2
必须为n
1
必须是从矛盾中伪造的,否则同样,如果您收到类型为x
的{{1}},则表示您只需要对y
和F T 0
进行模式匹配。
答案 1 :(得分:1)
这是一个按某种值划分的类型的例子:
open import Data.Nat
infixr 4 _∷_
data ≤List (n : ℕ) : Set where
[] : ≤List n
_∷_ : {m : ℕ} -> m ≤ n -> ≤List n -> ≤List n
1≤3 : 1 ≤ 3
1≤3 = s≤s z≤n
3≤3 : 3 ≤ 3
3≤3 = s≤s (s≤s (s≤s z≤n))
example : ≤List 3
example = 3≤3 ∷ 1≤3 ∷ []
这是一种列表,每个元素都小于或等于n
。一般的直觉是:如果某个类型的每个居民都拥有某个属性,那么您可以将其抽象为参数。还有一个机械规则:“如果每个构造函数在第一个索引位置(在结果类型中)具有相同的变量,则第一个索引可以转换为新参数。”
这个引用来自*,你应该读它。