Như Salil đã nói, hai là những khái niệm khác nhau:
Một dòng là một (có khả năng vô hạn) danh sách các giá trị, thông thường, nhưng không nhất thiết, tính trong thời trang lười biếng, nghĩa là chỉ lưu trữ một số cách tính toán các giá trị khi được yêu cầu. Có rất nhiều ví dụ xung quanh mà không liên quan đến monads dưới mọi hình thức:
(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers))
Nó là khá hữu ích cũng phải xem xét hữu hạn, precomputed, danh sách như suối, vì bạn có thể sử dụng chúng ở bất cứ đâu một (có khả năng hoặc thiết) hữu hạn luồng lười biếng có thể được sử dụng.
Vì vậy, luồng là thứ có hoạt động next: streamType -> (valueType streamType)
để nhận giá trị tiếp theo và luồng còn lại.
Monads, Mặt khác, ít của một cấu trúc dữ liệu và nhiều hơn nữa một cách viết mã nguồn bằng cách kết hợp các lệnh cá nhân.
Có lẽ ví dụ hữu ích đơn giản nhất là “Có lẽ đơn nguyên” - Tôi không chắc nó trông như thế nào trong Đề án, xin lỗi, nhưng ý tưởng là: Đưa ra danh sách tính toán (f g h)
và nhập x
, thực hiện tính toán theo thứ tự, gần như được đưa ra (f (g (h x)))
, nhưng để cho mỗi chức năng thất bại một cách duyên dáng: Nếu g
trả về nil
, không gọi (f nil)
, mà thay vào đó, hãy trả lại nil
ngay lập tức.
Bạn có thể, tất nhiên, kết hợp hai trong những cách hữu ích khác nhau và tính toán giá trị luồng của mình với monads hoặc đóng gói việc sử dụng các dòng như I/O suối mà không phải là chính xác sau sự mong đợi của lập trình chức năng trong một đơn nguyên (để tránh mã lưu trữ một tham chiếu đến một số trạng thái trước đó của luồng), nhưng chúng phục vụ các mục đích hoàn toàn khác nhau. Hãy suy nghĩ về lớp trừu tượng (đóng nắp, không nhìn vào bên trong): Một đơn nguyên, áp dụng cho các hàm, cung cấp cho bạn một hàm. Ngược lại, một luồng không phải là hàm số cao hơn, mà là một danh sách các giá trị. Rõ ràng, chức năng được xác định bởi (hoặc trả về từ, tùy thuộc vào quan điểm của bạn) đơn nguyên có thể là việc triển khai luồng, và cũng có thể, các giá trị được trích xuất từ luồng có thể là đơn nguyên. Nhưng như bạn có thể thấy ở trên, có những người thực hiện những điều hoàn toàn khác với các luồng. Cho dù có các luồng không được thực hiện như monads có lẽ phụ thuộc vào chính xác những gì bạn sử dụng thuật ngữ cho. Tôi phải thú nhận rằng tôi không chắc chắn vào lúc này nếu các dòng vô hạn đúng cách đủ điều kiện làm đơn nguyên; danh sách hữu hạn rõ ràng là làm.
Theo như tôi hiểu, luồng của Đề án là các giá trị lười biếng trong khi Monads là chuỗi tùy chỉnh tính toán. – Salil
Các luồng chính xác là danh sách lười biếng. Làm thế nào có thể "các giá trị lười biếng" được trình bày mà không có monads hoặc một lần nữa danh sách lười biếng hoặc một cái gì đó như thế nào? Đừng nhầm lẫn giữa "các giá trị lười biếng" với các biến chức năng không thay đổi. Vâng, và "chuỗi tùy chỉnh tính toán" có tương ứng một-một với "thậm chí suối"? – cofp
Vâng. So sánh các định nghĩa của cả "ngay cả luồng" và monads. Và cũng là tiên đề của họ. Như tôi biết, mỗi luồng có thể được thể hiện qua một đơn nguyên. Có đúng là mỗi "giá trị" hay "tính toán" đơn điệu có thể được thể hiện qua một "dòng chẵn" không? Có giới hạn nào không? – cofp