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 refvà 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,
refvà 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, 'dvà cho tất cả các chức năng g : 'a -> 'c, h : 'b -> 'dchúng ta có:
map h ∘ f = f ∘ map g
(Lưu ý, fbên trái có loại 'a list -> 'b listvà fbê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ì gchúng tôi thích, vì vậy hãy để 'a = 'cvà 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 = boolvà 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 = fkhô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à falsevà 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 đó 'blà bool. Chúng tôi đã chỉ ra rằng khi fđược gọi với kiểu f : 'a list -> bool listcho bất kỳ 'a, fphải luôn trả về danh sách trống. Có thể là khi chúng ta gọi fnhư f : 'a list -> unit listnó 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à flà 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 listvà, 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 fphả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 = nvà x_1chỉ liên quan đến y_1và x_2có liên quan đến y_2và như vậy). Và phần thú vị là, trong trường hợp của chúng tôi, vì flà đ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, 'bvà 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 fluô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ố 'aliê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 listcó liên quan đến chính nó. Như chúng ta biết, flấ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 listlà 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.