Tôi đang làm việc trên phần mở rộng camlp4 cho chú thích giống như haskell trong Ocaml, và cố gắng tìm hiểu cách GHC biên dịch các ràng buộc đệ quy (được kích hoạt bằng -XDoRec).
Tôi tự hỏi liệu có thể cho bộ kết hợp điểm cố định đơn thuần tồn tại bằng ngôn ngữ nghiêm ngặt (như Ocaml/F #/SML/...) không?
Nếu có, nó trông như thế nào? Nó sẽ rất hữu ích?MonadFix bằng ngôn ngữ nghiêm ngặt
Trả lời
Chiếc F biểu hiện # tính toán cú pháp (liên quan đến Haskell do
) hỗ trợ đệ quy:
let rec ones = seq {
yield 1
yield! ones }
này được hỗ trợ bởi vì người xây dựng tính toán có để hỗ trợ Delay
hoạt động ngoài khác monadic (hoặc MonadPlus) hoạt động. Mã này được phiên dịch sang một cái gì đó như:
let rec ones =
seq.Combine
(seq.Yield(1),
seq.Delay(fun() -> seq.YieldFrom(ones)))
Loại Delay
là, nói chung, (unit -> M<'T>) -> M<'T>
và lừa là nó kết thúc tốt đẹp một tính toán với các hiệu ứng (hoặc tham chiếu đệ quy trực tiếp) vào một tính toán chậm được đánh giá trên nhu cầu.
Nếu bạn muốn tìm hiểu thêm về cách cơ chế làm việc tại F #, sau đó hai giấy tờ sau đây có liên quan:
- Syntax Matters: Writing abstract computations in F#
- Initializing Mutually Referential Abstract Objects: The Value Recursion Challenge
Người đầu tiên mô tả cách thức F # cú pháp biểu thức tính toán được desugared (và làm thế nào Delay
được chèn vào - và nói chung, làm thế nào F # kết hợp tính toán chậm trễ và háo hức với các hiệu ứng) và thứ hai mô tả cách F # xử lý let rec
các khai báo có giá trị - như giá trị ones
ở trên.
- 1. Thành ngữ cho typedef nghiêm ngặt trong C++
- 2. HTML5 DOCTYPE với nghiêm ngặt
- 3. Nghiêm ngặt hoặc Chuyển tiếp?
- 4. Tắt chế độ nghiêm ngặt của MySQL
- 5. C++ liên kết - nghiêm ngặt và yếu
- 6. Các mảng Haskell quá nghiêm ngặt?
- 7. FILTER_VALIDATE_URL có quá nghiêm ngặt không?
- 8. xHTML 1.0 nghiêm ngặt - Xác thực iFrames
- 9. HTML Tăng nghiêm ngặt chiều cao dòng
- 10. Khoảng cách XHTML nghiêm ngặt bên trong nhãn là ngữ nghĩa
- 11. Định nghĩa nghiêm ngặt để đọc/ghi tệp CSV
- 12. Console.log bằng ngôn ngữ Dart
- 13. Đa ngôn ngữ Ngôn ngữ
- 14. Máy nén YUI và gợi ý "sử dụng nghiêm ngặt"
- 15. Ngày hiển thị trên iPhone bằng ngôn ngữ người dùng nhưng bằng ngôn ngữ khác
- 16. C++: Nghiêm ngặt răng cưa và lạm dụng công đoàn
- 17. Bật cảnh báo bí danh nghiêm ngặt trong g + +
- 18. Biến toàn cầu ở chế độ nghiêm ngặt JavaScript
- 19. Trong ECMAScript5, phạm vi "sử dụng nghiêm ngặt" là gì?
- 20. cảnh báo aliasling nghiêm ngặt về gcc 4.6.1 lỗi
- 21. Haskell: Các hoạt động boolean không nghiêm ngặt
- 22. "sử dụng nghiêm ngặt" chỉ trong gỡ lỗi?
- 23. vi phạm chế độ nghiêm ngặt liệt kê
- 24. Tùy chọn GCC cho mã C nghiêm ngặt nhất?
- 25. Chế độ nghiêm ngặt: Thay thế cho arguments.callee.length?
- 26. Cách nhận người gọi từ chế độ nghiêm ngặt?
- 27. XHTML Nghiêm ngặt: thẻ br bên trong thẻ p
- 28. Thời gian 24 giờ nghiêm ngặt trong JFormattedTextField
- 29. Tiêu chuẩn nghiêm ngặt: lỗi mysqli_next_result() với mysqli_multi_query
- 30. Chế độ nghiêm ngặt của PHPUnit làm gì?
Vì vậy, không - không thể thực hiện theo cách hoàn toàn nghiêm ngặt. Vì tất cả các ngôn ngữ chức năng có một số khái niệm về sự lười biếng (chủ yếu là sử dụng các hàm, các bao đóng và các biến) - có thể có trong các "ngôn ngữ nghiêm ngặt" thông qua các cấu trúc lười. –
Thường thì sự lười biếng đã có nhưng nếu đơn nguyên của bạn ở đằng sau một kiểu trừu tượng, OCaml sẽ không cho phép bạn khai thác nó - 'Loại biểu thức này không được cho phép như bên phải của 'let rec''. Bạn cần phải tìm đối số giả định 'đơn vị' trong các trường hợp như vậy (hoặc có thể là" lười "nếu bạn cần ghi nhớ ...) – lukstafi