Tôi không nghĩ rằng có một chức năng tự ứng dụng duy nhất sẽ hoạt động cho tất cả các điều khoản trong Haskell. Tự ứng dụng là một điều đặc biệt trong tính toán lambda đã nhập, thường sẽ loại bỏ việc gõ. Điều này liên quan đến thực tế là với việc tự ứng dụng, chúng ta có thể biểu diễn bộ kết hợp điểm cố định, giới thiệu sự mâu thuẫn trong hệ thống kiểu khi được xem như một hệ thống logic (xem thư từ Curry-Howard).
Bạn đã hỏi về việc áp dụng nó cho hàm id
. Trong ứng dụng tự id id
, hai số id
có các loại khác nhau. Rõ ràng hơn là (id :: (A -> A) -> (A -> A)) (id :: A -> A)
(đối với bất kỳ loại nào A
). Chúng tôi có thể tự tạo một ứng dụng được thiết kế đặc biệt cho chức năng id
:
sa :: (forall a. a -> a) -> b -> b
sa f = f f
ghci> :t sa id
sa id :: b -> b
hoạt động tốt, nhưng bị giới hạn bởi loại hình này.
Sử dụng RankNTypes
bạn có thể làm cho các gia đình có chức năng tự ứng dụng như thế này, nhưng bạn sẽ không thể thực hiện chức năng tự ứng dụng chung như vậy sa t
sẽ được đánh máy tốt t t
. ít nhất là không có trong System Fω ("F-omega"), tính toán cốt lõi của GHC dựa trên).
Lý do, nếu bạn làm việc chính thức (có thể), thì chúng tôi có thể nhận được sa sa
, không có hình thức bình thường và Fω được biết là chuẩn hóa (cho đến khi chúng tôi thêm fix
tất nhiên).
Bạn nghĩ loại 'sa' nên có? Hãy nhớ rằng tất cả các điều khoản trong Haskell phải có một loại. Ngoài ra, bạn đang cố giải quyết vấn đề gì? – Alec
@ Tôi không biết, phải mất một chức năng có thể có chức năng? Tôi chỉ đang học tính toán lambda và tự hỏi làm thế nào để thể hiện nó trong Haskell. Tôi nghĩ Haskell sẽ rất hay để kiểm tra từng ví dụ, nhưng tôi đã bị mắc kẹt ngay lập tức. Có lẽ Lisp hoặc Scheme dễ dàng hơn cho mục đích này. –
Không phải là ngôn ngữ bạn sử dụng. Hãy thử xây dựng hàm này trong phép tính lambda đã nhập và suy nghĩ nên có loại nào.Vấn đề chúng tôi sẽ là tương tự, bạn không thể xây dựng các loại vô hạn – Euge