的“7.3.2.数据类型的派生操作”章节数据类型的宇宙论展示如何使用描述导出操作。虽然,导出的Eq
那里比较弱。
基本思想是使用某种一阶编码(即用某种通用数据类型)来表示数据类型,并定义对此数据类型的操作,因此用它编码的所有内容都可以由这些通用操作来处理。我详细阐述了这个机器的简单版本here.
你可以衍生出更强大的Eq
,如果你有一个封闭的宇宙。使用类似于描述的方法(应该具有同样的表达能力,但我没有检查)和我定义的通用封闭宇宙show
here,这允许例如在命名构造函数后打印元组向量:
instance
named-vec : {A : Type} -> Named (vec-cs A)
named-vec = record { names = "nil" ∷ "cons" ∷ [] }
test₂ : show (Vec (nat & nat) 3 ∋ (7 , 8) ∷ᵥ (9 , 10) ∷ᵥ (11 , 12) ∷ᵥ []ᵥ)
≡ "(cons 2 (7 , 8) (cons 1 (9 , 10) (cons 0 (11 , 12) nil)))"
test₂ = prefl
where Vec
的定义类似于Desc
数据类型。这Eq
情况应该类似,但更复杂。
这是如何Lift
可以使用:
⟦_⟧Type : Type → Set₁
⟦ Nat ⟧Type = Lift ℕ
⟦ Prp ⟧Type = Set
ex₁ : ∀ A -> ⟦ A ⟧Type
ex₁ Nat = lift 0
ex₁ Prp = ℕ
ex₂ : ∀ A -> ⟦ A ⟧Type -> Maybe ℕ
ex₂ Nat n = just (lower n) -- or (ex₂ Nat (lift n) = just n)
ex₂ Prp t = nothing
If A : Set α
then Lift A : Set (α ⊔ ℓ)
对于任何ℓ
。所以当你有ℕ : Set
and Set : Set₁
,你想举起ℕ
from Set
to Set₁
,这只是Lift ℕ
— 在简单的情况下你不需要提供ℓ
明确地。
构造包装在其中的数据类型的元素Lift
你用lift
(像lift 0
)。要取回这个元素,您可以使用lower
, so lift
and lower
是互为倒数的。但请注意lift (lower x)
不一定位于同一个宇宙x
, 因为lift (lower x)
“刷新”ℓ
.
UPDATE: the show
链接现在已损坏(我应该使用永久链接)。但现在有一个更好的例子:整个图书馆从而得出Eq
对于常规 Agda 数据类型。