Câu hỏi sau liên quan đến Recursive algebraic data types via polymorphism in Haskell.Giá trị của kiểu dữ liệu đại số đệ quy được mã hóa đa hình là gì?
Loại dữ liệu đại số đệ quy có thể được thực hiện bằng bất kỳ ngôn ngữ nào có khả năng của Hệ thống F sử dụng đa hình tham số phổ quát. Ví dụ, loại số tự nhiên có thể được giới thiệu (trong Haskell) như
newtype Nat = Nat { runNat :: forall t. (t -> (t -> t) -> t) }
với 'bình thường' số tự nhiên n
được thực hiện như
\ x0 f -> f(f(...(f x0)...))
với n
lặp của f
sử dụng.
Tương tự, các loại Booleans có thể được giới thiệu như là
newtype Bool = Bool { runBool :: forall t. t -> t -> t }
với các giá trị dự kiến 'true' và 'sai' được thực hiện như
true = \ t f -> t
false = \ t f -> f
Q: Có phải tất cả về loại Bool
hoặc Nat
hoặc bất kỳ loại dữ liệu đại số có khả năng đệ quy nào khác (được mã hóa theo cách này) của biểu mẫu trên, tối đa một số quy tắc giảm của ngữ nghĩa hoạt động?
Ví dụ 1 (số tự nhiên): Là bất kỳ hạn của loại forall t. t -> (t -> t) -> t
'tương đương' trong một số ý nghĩa với thời hạn dưới hình thức \ x0 f -> f (f (... (f x0) ...))
?
Ví dụ 2 (Booleans): Là bất kỳ hạn của loại forall t. t -> t -> t
'tương đương' trong một nghĩa nào đó cho một trong hai \ t f -> t
hoặc \ t f -> f
?
Phụ Lục (phiên bản nội bộ): Trong trường hợp các ngôn ngữ đang được xem xét thậm chí còn có khả năng thể hiện sự bình đẳng mệnh đề, câu hỏi meta-toán học này có thể được internalized như sau, và tôi sẽ rất hạnh phúc nếu ai đó sẽ đưa ra một giải pháp cho nó:
đối với bất kỳ functor m
chúng ta có thể xác định các mô-đun phổ quát và một số chức năng giải mã mã hóa trên đó như sau:
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 : Trong trường hợp ngôn ngữ có khả năng diễn đạt điều này: là loại bình đẳng dec_enc = id
có người ở không?
Kính gửi Peter - cảm ơn vì câu trả lời của bạn, và xin lỗi trong một thời gian dài tôi phải trả lời! Bạn đã bỏ qua trừu tượng và ứng dụng đa hình từ các điều khoản của bạn? Dường như với tôi rằng người ta phải xem xét các dạng bình thường với các trừu tượng hàng đầu có thể xen kẽ giữa thuật ngữ trừu tượng và kiểu, cũng như các thuật ngữ ứng dụng như '(y P1 ... Pk) [T]' bên trong những trừu tượng này. Tuy nhiên, điều này dường như không gây ra bất kỳ biến chứng nghiêm trọng nào trong lập luận của bạn. – Hanno
@Hanno Câu trả lời của tôi được đưa ra cho phiên bản Curry-style của System-F không có bất kỳ chú thích kiểu hoặc Λ về mặt nào. Nhưng tôi tin rằng lập luận tương tự cũng có thể được sử dụng cho phong cách Giáo hội. Tôi cũng khuyên bạn nên [câu trả lời này] (http://math.stackexchange.com/a/856347/37490) cung cấp bằng chứng hoàn toàn khác - nó không cho thấy chỉ có 2 thuật ngữ ở dạng bình thường, nhưng nó cho thấy rằng tất cả các điều khoản của kiểu boolean là [mở rộng bằng nhau] (https://en.wikipedia.org/wiki/Extensional_equality) thành 'K' và' K * '. –
Được rồi, cảm ơn! Tuy nhiên, tôi đã vấp phải một câu trong cuốn CoQ'Art (p.XII trong Lời nói đầu) làm tôi bối rối: Liên quan đến mã hóa đa hình các kiểu đệ quy, nó nói "..., cô ấy [Christine Mohring] nhận ra rằng ' Các mã hóa trong tính toán đa hình lambda đã giới thiệu các thuật ngữ ký sinh và làm cho nó không thể diễn tả các nguyên tắc cảm ứng thích hợp. " Bạn có biết điều này phù hợp với câu trả lời của bạn không? – Hanno