假设为了描述类似树的代数数据类型,我们使用以下类型Data
:
∀(D : *) →
∀(S : *) →
∀(P : *) →
∀(data : S → D) →
∀(add : P → S → S) →
∀(zer : S) →
∀(mul : (D → D) → P → P) →
∀(one : P) →
D
例如,这是类型List Nat
:
λ(D : *) →
λ(S : *) →
λ(P : *) →
λ(data : S → D) →
λ(add : P → S → S) →
λ(zer : S) →
λ(mul : (D → D) → P → P) →
λ(one : P) →
-- data List Nat =
data
-- Cons
(add
-- Nat
(mul (λ(list : D) →
-- data Nat =
data
-- Succ Nat
(add (mul (λ(nat : D) → nat) one)
-- Zero
(add one zer)))
-- List Nat
(mul (λ(list : D) → list) one))
-- Nil
(add one zer))
现在,如果我们将Data.type
定义为:
λ (type : #Data ) ->
type ? ? ?
(λ (data:?) -> ∀ (a:?) -> (data a))
(λ (ctorType: ?) -> λ (rest:?) -> ∀ (a:?) -> ∀ (ctor:(ctorType a)) -> (rest a))
(∀ (a:?) -> a)
(λ (fieldType: ?) -> λ (rest:?) -> ∀ (a:?) -> ∀ (field:(fieldType a)) -> (rest a))
(∀ (a:?) -> a)
我们将它应用于List Nat
,忽略类型错误,这种错误会归一化为教会编码的nat列表的类型,即∀(a:*) -> (((∀ (a:*) -> ((a -> a) -> a -> a)) -> a -> a) -> a -> a
。我想知道:
是否可以输入Data.type
字词?
如果没有,有没有办法达到类似的效果,使用不同的策略?