Đầu tiên một giải thích thuật ngữ: vị trí tiêu cực và tích cực đến từ logic. Họ đang chuẩn bị một assymetry trong từ nối logic: trong các cư xử khác với . Một điều tương tự xảy ra trong lý thuyết thể loại, trong đó chúng ta nói tương phản và covariant thay vì tiêu cực và tích cực, tương ứng. Trong vật lý, chúng nói về các đại lượng ứng xử "covariantly" và "contravariantly. Vì vậy, đây là một hiện tượng rất chung. Một lập trình viên có thể nghĩ chúng là" đầu vào "và" đầu ra ".Một BA⇒BAB
Bây giờ vào kiểu dữ liệu quy nạp.
Hãy nghĩ về một kiểu dữ liệu quy nạp như một loại cấu trúc đại số: nhà xây dựng là những hoạt động mà mất yếu tố của như các đối số và sản xuất các yếu tố mới của . Điều này rất giống với đại số thông thường: phép cộng có hai số và tạo ra một số.T T TTTT
Trong đại số, theo thông lệ, một phép toán có số lượng đối số hữu hạn và trong hầu hết các trường hợp, nó cần 0 (hằng số), một (không chính thức) hoặc hai đối số (nhị phân). Thật thuận tiện để khái quát hóa điều này cho các nhà xây dựng của kiểu dữ liệu. Giả sử c
là một hàm tạo cho kiểu dữ liệu T
:
- nếu
c
là một hằng số chúng ta có thể nghĩ về nó như là một hàm unit -> T
, hoặc tương đương (empty -> T) -> T
,
- nếu
c
là unary chúng ta có thể nghĩ về nó như là một hàm T -> T
, hoặc tương đương (unit -> T) -> T
,
- nếu
c
là nhị phân, chúng ta có thể nghĩ về nó như là một hàm T -> T -> T
, hoặc tương đương T * T -> T
, hoặc tương đương (bool -> T) -> T
,
- nếu chúng ta muốn một hàm tạo
c
có bảy đối số, chúng ta có thể xem nó như là một hàm (seven -> T) -> T
trong đó seven
một số loại được xác định trước đó với bảy phần tử.
- chúng ta cũng có thể có một hàm tạo
c
có vô số đối số, đó sẽ là một hàm (nat -> T) -> T
.
Những ví dụ này cho thấy hình thức chung của một nhà xây dựng nên là
c : (A -> T) -> T
trong đó chúng ta gọi A
là arity của c
và chúng ta nghĩ về c
một hàm tạo có A
nhiều đối số kiểu T
để tạo ra một phần tử của T
.
Đây là một điều rất quan trọng: các yếu tố phải được xác định trước khi chúng ta xác định T
, hoặc nếu không chúng ta không thể nói những gì các nhà xây dựng phải làm. Nếu ai đó cố gắng có một nhà xây dựng
broken: (T -> T) -> T
sau đó câu hỏi "có bao nhiêu đối số broken
?" không có câu trả lời hay Bạn có thể cố gắng trả lời nó bằng "cần T
nhiều đối số", nhưng điều đó sẽ không xảy ra, vì T
chưa được xác định. Chúng ta có thể cố gắng thoát khỏi cunundrum bằng cách sử dụng lý thuyết điểm cố định ưa thích để tìm một loại T
và hàm tiêm (T -> T) -> T
, và sẽ thành công, nhưng chúng ta cũng sẽ phá vỡ nguyên tắc cảm ứng T
trên đường đi. Vì vậy, đó chỉ là một ý tưởng tồi để thử một điều như vậy.
Để hoàn thiện, hãy để tôi giải thích toàn bộ câu chuyện. Chúng ta cần khái quát các hình thức xây dựng ở trên một chút. Đôi khi chúng ta có các hoạt động hoặc hàm tạo lấy tham số . Ví dụ, phép nhân vô hướng lấy vô hướng và vectơ để tạo ra vectơ . Đây là một phép toán đơn phương trên các vectơ, được tham số hóa bởi một vô hướng. Chúng ta có thể xem phép nhân vô hướng là vô số các phép toán đơn nguyên, một phép toán cho mỗi vô hướng, nhưng điều đó gây khó chịu. Vì vậy, dạng chung của một hàm tạo nên cho phép một tham số thuộc loại nào đó :v λ ⋅ vλvλ⋅vc
B
c : B * (A -> T) -> T
Trên thực tế, nhiều nhà xây dựng có thể được viết lại theo cách này, nhưng không phải tất cả, chúng tôi cần thêm một bước, cụ thể là chúng ta nên cho phép A
để phụ thuộc vào B
:
c : (∑ (x : B), A x -> T) -> T
Đây là hình thức cuối cùng của một hàm tạo cho kiểu quy nạp. Nó cũng chính xác là loại W là gì. Biểu mẫu rất chung chung đến nỗi chúng ta chỉ cần một nhà xây dựng duy nhất c
! Thật vậy, nếu chúng ta có hai trong số họ
d' : (∑ (x : B'), A' x -> T) -> T
d'' : (∑ (x : B''), A'' x -> T) -> T
sau đó chúng ta có thể kết hợp chúng thành một
d : (∑ (x : B), A x -> T) -> T
Ở đâu
B := B' + B''
A(inl x) := A' x
A(inr x) := A'' x
Nhân tiện, nếu chúng ta cà ri hình thức chung, chúng ta thấy rằng nó tương đương với
c : ∏ (x : B), ((A x -> T) -> T)
gần với những gì mọi người thực sự viết ra trong các trợ lý chứng minh. Các trợ lý chứng minh cho phép chúng tôi viết ra các hàm tạo theo những cách thuận tiện, nhưng chúng tương đương với dạng chung ở trên (bài tập!).
A
và làm nổ tung ngăn xếp (trong các ngôn ngữ dựa trên ngăn xếp).