Chà, một cái gì đó được gọi là tham số cho chúng ta biết rằng nếu chúng ta xem xét tập con thuần túy của ML (nghĩa là không có đệ quy vô hạn ref
và tất cả những thứ kỳ lạ đó), không có cách nào để định nghĩa một hàm với loại này ngoài loại trả về trống danh sách.
Tất cả điều này bắt đầu với các Định lý về giấy của Wadler miễn phí! Mùi. Bài viết này, về cơ bản, cho chúng ta hai điều:
- Nếu chúng ta xem xét các ngôn ngữ lập trình thỏa mãn một số điều kiện nhất định, chúng ta có thể suy ra một số định lý hay chỉ bằng cách xem chữ ký loại của hàm đa hình (cái này được gọi là Định lý tham số).
- ML (không có đệ quy vô hạn,
ref
và tất cả những thứ kỳ lạ đó) thỏa mãn những điều kiện đó.
Từ Parametricity lý chúng ta đều biết rằng nếu chúng ta có một chức năng f : 'a list -> 'b list
, sau đó cho tất cả 'a
, 'b
, 'c
, 'd
và cho tất cả các chức năng g : 'a -> 'c
, h : 'b -> 'd
chúng ta có:
map h ∘ f = f ∘ map g
(Lưu ý, f
bên trái có loại 'a list -> 'b list
và f
bên phải là 'c list -> 'd list
.)
Chúng tôi có thể tự do lựa chọn bất cứ điều gì g
chúng tôi thích, vì vậy hãy để 'a = 'c
và g = id
. Bây giờ vì map id = id
(dễ dàng chứng minh bằng cảm ứng về định nghĩa map
), chúng ta có:
map h ∘ f = f
Bây giờ hãy để 'b = 'd = bool
và h = not
. Chúng ta hãy giả sử cho một số zs : bool list
điều đó xảy ra rằng f zs ≠ [] : bool list
. Rõ ràng là map not ∘ f = f
không phải giữ, bởi vì
(map not ∘ f) zs ≠ f zs
Nếu phần tử đầu tiên của danh sách bên phải là true
, thì bên trái phần tử đầu tiên là false
và ngược lại!
Điều này có nghĩa, giả định của chúng tôi là sai và f zs = []
. Chúng ta làm xong chưa? Không.
Chúng tôi cho rằng đó 'b
là bool
. Chúng tôi đã chỉ ra rằng khi f
được gọi với kiểu f : 'a list -> bool list
cho bất kỳ 'a
, f
phải luôn trả về danh sách trống. Có thể là khi chúng ta gọi f
như f : 'a list -> unit list
nó trả lại một cái gì đó khác nhau? Trực giác của chúng tôi cho chúng tôi biết rằng điều này là vô nghĩa: chúng tôi không thể viết bằng ML thuần túy một hàm luôn trả về danh sách trống khi chúng tôi muốn nó cung cấp cho chúng tôi một danh sách các booleans và có thể trả về một danh sách không trống! Nhưng đây không phải là một bằng chứng.
Những gì chúng ta muốn nói là f
là thống nhất : nếu nó luôn luôn trả về danh sách trống cho bool list
, sau đó nó phải trả lại danh sách trống cho unit list
và, nói chung, bất kỳ 'a list
. Đây chính xác là điểm thứ hai trong danh sách dấu đầu dòng trong câu trả lời của tôi.
Bài viết cho chúng ta biết rằng trong ML f
phải lấy các giá trị liên quan đến các giá trị liên quan . Tôi không đi sâu vào chi tiết về các mối quan hệ, đủ để nói rằng các danh sách có liên quan khi và chỉ khi chúng có độ dài bằng nhau và các yếu tố của chúng có liên quan đến cặp đôi (nghĩa là [x_1, x_2, ..., x_m]
và [y_1, y_2, ..., y_n]
có liên quan khi và chỉ khi m = n
và x_1
chỉ liên quan đến y_1
và x_2
có liên quan đến y_2
và như vậy). Và phần thú vị là, trong trường hợp của chúng tôi, vì f
là đa hình, chúng tôi có thể xác định bất kỳ mối quan hệ nào trên các yếu tố của danh sách!
Hãy chọn bất kỳ 'a
, 'b
và nhìn vào f : 'a list -> 'b list
. Bây giờ nhìn vào f : 'a list -> bool list
; chúng tôi đã chỉ ra rằng trong trường hợp này f
luôn trả về danh sách trống. Bây giờ chúng tôi yêu cầu tất cả các yếu tố 'a
liên quan đến bản thân họ (hãy nhớ rằng, chúng tôi có thể chọn bất kỳ mối quan hệ nào chúng tôi muốn), điều này ngụ ý rằng bất kỳ yếu tố nào zs : 'a list
có liên quan đến chính nó. Như chúng ta biết, f
lấy các giá trị liên quan đến các giá trị liên quan, điều này có nghĩa f zs : 'b list
là có liên quan f zs : bool list
, nhưng danh sách thứ hai có độ dài bằng 0 và vì danh sách đầu tiên có liên quan đến nó, nên nó cũng trống.
Để đầy đủ, tôi sẽ đề cập rằng có một phần về tác động của đệ quy chung (có thể không chấm dứt) trong bài báo gốc của Wadler, và cũng có một bài viết tìm hiểu các định lý miễn phí với sự có mặt của seq
.