Gần đây tôi đã phủ nhận kiến thức của mình về cách thức hoạt động của Monads. Tôi cũng đã được giới thiệu về khái niệm 'Comonad' , được mô tả là đối ngẫu ngược của một đơn nguyên . Tuy nhiên, tôi không thể quấn đầu xung quanh nó.
Để hiểu về Monads, tôi tự tạo ra sự tương đồng cho chính mình:
Monads có thể được coi là "bản thiết kế để xây dựng các băng chuyền biểu thức".
Để xác định Monad mới (một loại hệ thống băng chuyền mới), bạn cần xác định:
- Một cách để đặt một cái gì đó lên băng chuyền, ví dụ: 'bắt đầu' một băng chuyền. (Được gọi là
unit
hoặcreturn
)- Một cách để kết nối một máy (một biểu thức) sẽ là một phần của băng chuyền với băng chuyền. (Được biết là
join
hoặcbind
hoặc>>=
).(Có một hoạt động thứ ba lấy băng chuyền hiện tại, ném nội dung của nó đi và bắt đầu một băng chuyền mới được gọi là
>>
, nhưng nó rất hiếm khi được sử dụng.)Để các máy móc và băng tải hoạt động chính xác với nhau, bạn sẽ cần đảm bảo rằng:
- Nếu bạn đặt một cái gì đó lên băng chuyền và đưa nó qua máy, đầu ra sẽ giống như khi bạn đưa nó qua máy bằng tay. (Danh tính bên trái)
- Nếu bạn muốn đặt một băng chuyền ở giữa một băng chuyền đã có sẵn, bạn không nên kết thúc với một băng chuyền có một băng chuyền trên đầu, mà là một băng chuyền dài hơn, duy nhất. (Danh tính đúng)
- Sẽ không thành vấn đề đối với đầu ra nếu bạn sử dụng máy A theo cách thủ công, sau đó chuyển kết quả qua BC được kết nối băng tải hoặc nếu bạn sử dụng AB kết nối băng tải và sau đó chuyển kết quả qua C. Nói cách khác: (a >> = b) >> = c) phải giống với (a >> = (b >> = c)) (Tính kết hợp)
Băng tải đơn giản nhất sẽ là băng tải chỉ lấy đầu vào và luôn tiếp tục biểu thức tiếp theo. Đây là những gì một 'đường ống' là.
Một khả năng khác, là chỉ cho nó đi qua máy tiếp theo nếu một số điều kiện được đáp ứng cho giá trị. Điều này có nghĩa là nếu tại một số biểu thức ở giữa, giá trị thay đổi thành thứ không còn được phép thì phần còn lại của biểu thức sẽ bị bỏ qua. Đây là những gì đơn vị 'Có thể' làm trong Haskell.
Bạn cũng có thể thực hiện các quy tắc sao chép / thay đổi có điều kiện ưa thích khác trên các giá trị trước hoặc sau khi bạn chuyển chúng vào máy. Một ví dụ: Trình phân tích cú pháp (Ở đây, nếu một biểu thức trả về kết quả 'thất bại', giá trị từ trước khi biểu thức được sử dụng làm đầu ra).
Tất nhiên sự tương tự là không hoàn hảo, nhưng tôi hy vọng nó mang lại một đại diện ổn về cách thức hoạt động của các đơn vị.
Tuy nhiên, tôi gặp rất nhiều khó khăn để biến sự tương tự này lên đầu để hiểu về Comonads. Tôi biết từ một lượng nhỏ thông tin tôi đã tìm thấy trên internet mà Comonad định nghĩa:
extract
, Đó là loại mặt trái củareturn
, đó là, phải mất một giá trị ra của một Comonad.duplicate
, đó là loại nghịch đảo củajoin
, nghĩa là, nó tạo ra hai Comonad từ một cái duy nhất.
Nhưng làm thế nào một Comonad có thể được khởi tạo nếu chúng ta chỉ có thể trích xuất từ chúng hoặc sao chép chúng? Và làm thế nào chúng thực sự có thể được sử dụng? Tôi đã xem dự án rất tuyệt vời này và nói về nó (điều mà tôi không may hiểu rất ít), nhưng tôi không chắc phần chính xác được cung cấp bởi Comonad.
Comonad là gì? Chúng hữu ích cho việc gì? Làm thế nào chúng có thể được sử dụng? Chúng có ăn được không?
IO
đơn nguyên ) của đơn vị là hệ thống thời gian chạy Haskell, gọi ra main
. Tất nhiên cũng có unsafePerformIO
. Nếu bạn muốn nghĩ về Maybe
đơn nguyên là có một "cỗ máy ở cuối băng chuyền", bạn có thể sử dụng maybe
.
cobind
ứng dụng, phải có một số chức năng nào đó hữu ích với biểu diễn bên trong của comonad của bạn.