Chứng minh rằng λ x. Ω Ω in là một trong những mục tiêu mà Abramsky đặt ra cho lý thuyết tính toán lambda lười biếng của mình (trang 2 của bài báo , đã được trích dẫn bởi Uday Reddy), bởi vì cả hai đều ở dạng yếu đầu bình thường. Theo định nghĩa 2.7, ông thảo luận một cách rõ ràng rằng giảm eta λ x. M x → M thường không hợp lệ, nhưng có thể nếu M chấm dứt trong mọi môi trường. Điều này không có nghĩa là M phải là một hàm tổng - chỉ đánh giá M phải chấm dứt (ví dụ bằng cách giảm xuống lambda).
Câu hỏi của bạn dường như được thúc đẩy bởi mối quan tâm thực tế (hiệu suất). Tuy nhiên, mặc dù Báo cáo Haskell có thể chưa hoàn toàn rõ ràng, tôi nghi ngờ rằng việc đánh đồng x. ⊥ với sẽ tạo ra một triển khai hữu ích của Haskell; cho dù nó có thực hiện Haskell '98 hay không thì vẫn còn gây tranh cãi, nhưng được đưa ra nhận xét, rõ ràng các tác giả dự định nó sẽ là trường hợp.
Cuối cùng, làm thế nào seq để tạo các phần tử cho một kiểu đầu vào tùy ý? (Tôi biết QuickCheck định nghĩa kiểu chữ tùy ý cho điều đó, nhưng bạn không được phép thêm các ràng buộc như vậy ở đây). Điều này vi phạm tham số.
Đã cập nhật : Tôi đã không quản lý để mã quyền này (vì tôi không rành về Haskel) và việc sửa lỗi này dường như yêu cầu các runST
vùng lồng nhau . Tôi đã thử sử dụng một ô tham chiếu duy nhất (trong đơn vị ST) để lưu các phần tử tùy ý như vậy, đọc chúng sau và làm cho chúng có sẵn trên toàn cầu. Tham số chứng minh rằng break_parametricity
bên dưới không thể được xác định (ngoại trừ bằng cách trả về đáy, ví dụ như lỗi), trong khi nó có thể khôi phục các phần tử mà seq đề xuất của bạn sẽ tạo ra.
import Control.Monad.ST
import Data.STRef
import Data.Maybe
produce_maybe_a :: Maybe a
produce_maybe_a = runST $ do { cell <- newSTRef Nothing; (\x -> writeSTRef cell (Just x) >> return x) `seq` (readSTRef cell) }
break_parametricity :: a
break_parametricity = fromJust produce_maybe_a
Tôi phải thừa nhận rằng tôi hơi mờ nhạt trong việc chính thức hóa bằng chứng tham số cần thiết ở đây, nhưng việc sử dụng tham số không chính thức này là tiêu chuẩn trong Haskell; nhưng tôi đã học được từ các tác phẩm của Derek Drey rằng lý thuyết cần thiết đang nhanh chóng được thực hiện trong những năm cuối cùng này.
EDIT:
- Tôi thậm chí không chắc liệu bạn có cần các phần mở rộng đó, được nghiên cứu cho các ngôn ngữ giống như ML, mệnh lệnh và chưa được kiểm tra hay không, hoặc liệu các lý thuyết cổ điển về tham số bao trùm Haskell.
- Ngoài ra, tôi đã đề cập đến Derek Dreyer đơn giản vì sau này tôi chỉ tình cờ thấy tác phẩm của Uday Reddy - tôi mới biết về nó gần đây từ "Bản chất của Reynold". (Tôi chỉ bắt đầu thực sự đọc tài liệu về tham số trong tháng trước hoặc lâu hơn).