以下問題與Recursive algebraic data types via polymorphism in Haskell有關。多態編碼的遞歸代數數據類型的值是什麼?
遞歸代數數據類型可以通過使用通用參數多態性的系統F的功能以任何語言實現。例如,可以引入自然數的類型(在Haskell)作爲
newtype Nat = Nat { runNat :: forall t. (t -> (t -> t) -> t) }
與「通常」的自然數n
被實現爲
\ x0 f -> f(f(...(f x0)...))
與使用f
n
迭代。
同樣,布爾值的類型可以引入
newtype Bool = Bool { runBool :: forall t. t -> t -> t }
與預期值「真」和「假」被實現爲
true = \ t f -> t
false = \ t f -> f
問:是否所有條款鍵入Bool
或Nat
或上述形式的任何其他可能的遞歸代數數據類型(以這種方式編碼),直到操作語義的一些減少規則?
實施例1(自然數):是類型在某種意義上forall t. t -> (t -> t) -> t
「等效」到窗體\ x0 f -> f (f (... (f x0) ...))
的術語的任何術語?
實施例2(布爾):在某種意義上類型的任何術語forall t. t -> t -> t
'等效' 要麼\ t f -> t
或\ t f -> f
?
附錄(內部版):如果所考慮的語言,甚至能表達命題平等的,這個薈萃數學問題可以內化爲如下,我會很高興,如果有人想出爲它的解決方案:
對於任何算符m
我們可以定義通用模塊並在其上一些解碼 - 編碼的功能如下:
type ModStr m t = m t -> t
UnivMod m = UnivMod { univProp :: forall t. (ModStr m t) -> t }
classifyingMap :: forall m. forall t. (ModStr m t) -> (UnivMod m -> t)
classifyingMap f = \ x -> (univProp x) f
univModStr :: (Functor m) => ModStr m (UnivMod m)
univModStr = \ f -> UnivMod $ \ g -> g (fmap (classifyingMap g) f)
dec_enc :: (Functor m) => UnivMod m -> UnivMod m
dec_enc x = (univProp x) univModStr
Q :如果語言能夠表達這種情況:是否相等型dec_enc = id
居住?
親愛的彼得 - 謝謝你的回答,並且很抱歉我花了很長時間回覆!您是否遺漏了您的條款中的多態抽象和應用程序?在我看來,人們必須考慮可能在術語和類型抽象之間交替的主要抽象以及像這些抽象內部的'(y P1 ... Pk)[T]'這樣的應用術語。但是,這似乎並沒有在你的論點中引起任何嚴重的複雜性。 – Hanno
@Hanno我的答案是針對系統-F的咖喱式版本,沒有任何類型註釋或Λ。但我相信,同樣的觀點也可以用於教會的風格。我也推薦[這個答案](http://math.stackexchange.com/a/856347/37490),它給出了完全不同的證明 - 它沒有表明在正常形式中只有2個術語,但它顯示布爾類型的所有術語都[延伸等於](https://en.wikipedia.org/wiki/Extensional_equality)爲'K'和'K *'。 –
好的,謝謝!然而,我只是偶然發現了CoQ藝術書中的一個句子(前言中的第二部分),這使我感到困惑:關於遞歸類型的多態編碼,它說「......,她[克里斯汀莫林]意識到'她使用的「impressedicative」編碼並不尊重傳統類型的術語僅限於類型構造函數組合的傳統。多態lambda-演算中的編碼引入了寄生術語,並且無法表達適當的歸納原理。你知道這與你的答案相符嗎? – Hanno