Tôi không hiểu điều này chút nào, nhưng nếu điều này giúp ích cho bất kỳ ai ... thì bạn nhé.
Xem xét định nghĩa của fix
. fix f = let x = f x in x
. Phần rối loạn tâm trí x
được định nghĩa là f x
. Nhưng hãy nghĩ về nó trong một phút.
x = f x
Vì x = fx, nên chúng ta có thể thay thế giá trị của x
ở bên phải của nó, phải không? Vì vậy, do đó ...
x = f . f $ x
x = f . f . f $ x
x = f . f . f . f . f . f . f . f . f . f . f $ x
Vì vậy, mẹo là, để kết thúc, f
phải tạo ra một số loại cấu trúc, để f
mẫu sau này có thể khớp với cấu trúc đó và kết thúc đệ quy, mà không thực sự quan tâm đến "giá trị" đầy đủ của tham số của nó (?)
Tất nhiên, trừ khi bạn muốn làm điều gì đó như tạo một danh sách vô hạn, như luqui đã minh họa.
Giải thích giai thừa của TomMD là tốt. Chữ ký loại của Fix là (a -> a) -> a
. Nói cách khác, chữ ký kiểu cho (\recurse d -> if d > 0 then d * (recurse (d-1)) else 1)
là . Vì vậy, chúng tôi có thể nói rằng . Bằng cách đó, sửa chữa lấy hàm của chúng ta, tức là , hoặc thực sự, và sẽ trả về một kết quả kiểu , nói cách khác, nói cách khác, là một hàm khác!(b -> b) -> b -> b
(b -> b) -> (b -> b)
a = (b -> b)
a -> a
(b -> b) -> (b -> b)
a
b -> b
Chờ đã, tôi nghĩ nó phải trả về một điểm cố định ... không phải là một hàm. Đúng là như vậy, đại loại là (vì các hàm là dữ liệu). Bạn có thể tưởng tượng rằng nó cung cấp cho chúng ta hàm cuối cùng để tìm giai thừa. Chúng tôi đã cung cấp cho nó một hàm không biết cách đệ quy (do đó một trong các tham số của nó là một hàm được sử dụng để đệ quy) và fix
dạy nó cách đệ quy.
Hãy nhớ cách tôi đã nói rằng f
phải tạo ra một số loại cấu trúc để f
mẫu sau này có thể khớp và kết thúc? Vâng, điều đó không chính xác, tôi đoán vậy. TomMD đã minh họa cách chúng ta có thể mở rộng x
để áp dụng hàm và từng bước hướng tới trường hợp cơ sở. Đối với chức năng của mình, anh ta đã sử dụng if / then, và đó là nguyên nhân gây ra sự kết thúc. Sau nhiều lần thay thế, in
phần của toàn bộ định nghĩa fix
cuối cùng không còn được định nghĩa về mặt x
và đó là khi nó có thể tính toán và hoàn chỉnh.
fix error
ghci và cảm thấy hài lòng về bản thân."