是否可以使用一流描述派生ADT的类型和构造函数?

时间:2016-11-22 00:21:33

标签: haskell functional-programming agda idris morte

假设为了描述类似树的代数数据类型,我们使用以下类型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。我想知道:

  1. 是否可以输入Data.type字词?

  2. 如果没有,有没有办法达到类似的效果,使用不同的策略?

0 个答案:

没有答案