2013-03-21 30 views
10

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

14

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:

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.

+0

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. –

+0

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

Các vấn đề liên quan