Vâng, y
phải thuộc loại (a -> b) -> c
, đối với một số a
, b
và c
chúng tôi chưa biết; sau khi tất cả, nó có một hàm, f
và áp dụng nó cho một đối số, do đó, nó phải là một hàm lấy hàm.
Kể từ y f = f x
(một lần nữa, đối với một số x
), chúng ta biết rằng kiểu trả về của y
phải là kiểu trả về của f
riêng của mình. Vì vậy, chúng tôi có thể tinh chỉnh loại y
một chút: phải là (a -> b) -> b
đối với một số a
và b
mà chúng tôi chưa biết.
Để tìm hiểu xem a
là gì, chúng tôi chỉ cần xem loại giá trị được chuyển đến f
. Đó là y f
, là biểu thức mà chúng tôi đang cố gắng tìm ra loại ngay bây giờ. Chúng tôi đang nói rằng loại y
là (a -> b) -> b
(đối với một số a
, b
, v.v.), vì vậy chúng tôi có thể nói rằng ứng dụng này là y f
phải thuộc loại b
.
Vì vậy, loại đối số là f
là b
. Đặt tất cả lại với nhau, và chúng tôi nhận được (b -> b) -> b
- đó là, tất nhiên, cùng một điều như (a -> a) -> a
.
Dưới đây là chế độ xem trực quan hơn nhưng kém chính xác hơn: chúng tôi đang nói rằng y f = f (y f)
, chúng tôi có thể mở rộng đến tương đương y f = f (f (y f))
, y f = f (f (f (y f)))
, v.v. Vì vậy, chúng ta biết rằng chúng ta luôn có thể áp dụng f
xung quanh toàn bộ điều, và vì "toàn bộ điều" trong câu hỏi là kết quả của việc áp dụng f
cho một đối số, f
phải có loại a -> a
; và kể từ khi chúng tôi kết luận rằng toàn bộ điều là kết quả của việc áp dụng f
cho một đối số, kiểu trả về của y
phải là của số f
chính nó - đến với nhau, một lần nữa, như (a -> a) -> a
.
Giả sử đây là mã thực, chỉ cần kích hoạt bất kỳ ai đến với điều này. –
@MartinJames: Huh? Bạn nghĩ gì sai với mã?Nó không phải là cách tốt nhất để xác định hàm, nhưng nó là đơn giản nhất. –
@MartinJames, chức năng đó là một chức năng được nghiên cứu tốt được gọi là [Y Combinator] (http://en.wikipedia.org/wiki/Fixed-point_combinator). (Tôi nghĩ rằng đó là đúng - tôi không thể kiểm tra lại Wikipedia vào lúc này!) Dù sao, có thể bạn sẽ bị sa thải vì là một nhà triết học :-) –