2012-05-07 28 views
13

Có tồn tại sự khác biệt nào giữa các luồng (danh sách lười biếng) và monads không? Từ quan điểm khái niệm và toán học, không phải từ việc triển khai kỹ thuật.Streams vs monads

Hoặc người nào khác, không tồn tại biunique, một-một trong những thư từ giữa?

Chính xác hơn, vì luồng có nghĩa là "thậm chí luồng" từ SRFI-41 của ngôn ngữ Đề án.

Đây có phải là một danh mục khác với monads không? Nếu vậy, loại đó là gì?

Có thể "thậm chí luồng" đảm bảo kiểm soát các tác dụng phụ, như monads?

+0

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

+0

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

+0

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

Trả lời

5

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.

+0

Câu trả lời của bạn hữu ích hơn nhiều. Và phản đối câu trả lời trước đó không chống lại bất kỳ sự khác biệt nào. Chỉ là vấn đề của câu hỏi để tìm ra sự khác biệt. Nhưng phản đối trước câu trả lời là chống lại phương trình "giá trị lười biếng" với lời hứa của Đề án. Và chống lại cái gì khác, nhưng không chống lại bất kỳ sự khác biệt nào cả. – cofp

+0

Vâng, chỉ trong văn bản của câu hỏi là đề nghị không nhìn "dưới trang bìa". Vậy, sự khác biệt giữa "cấu trúc dữ liệu" và "cách làm" là làm gì đó ("viết mã")? Từ quan điểm trừu tượng từ thời gian và trạng thái. Để nói rằng một cái gì đó là nhiều hơn hoặc ít hơn một "cấu trúc dữ liệu". Và cấu trúc "danh sách lười biếng" hay chỉ là "cách"? Bởi vì tuyên bố rằng "dòng chính xác là danh sách lười biếng" chỉ là một phản đối "giá trị lười biếng". Từ đó nó không theo luồng đó chính xác là "cấu trúc dữ liệu". – cofp

+0

Lý do của bạn về "hàm cao hơn" là IMHO mạnh hơn. Mặc dù nó vẫn cần một bằng chứng rằng không có bất kỳ cách nào để sử dụng "thậm chí suối" như các chức năng cao hơn. Vì vậy, nó sẽ được chứng minh rằng dòng có nhiều hạn chế hơn modads. Nhưng để nói rằng họ là * hoàn toàn * khác nhau, đừng quên rằng các luồng có thể được thể hiện qua monads. Vì vậy, luồng chỉ là một danh mục con của các đơn vị. Nhưng danh mục con này có phải là "phụ" nghiêm ngặt không? Hay nó chỉ là một giao lộ một phần? IMHO câu hỏi mở. – cofp

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