Kiểu chữ Comonad trong Haskell là gì?


105

Kiểu chữ Comonad trong Haskell là gì? Như trong Comonad từ Control.Comonad trong gói comonad (giải thích về bất kỳ gói nào khác cung cấp kiểu chữ Comonad cũng được hoan nghênh). Tôi đã mơ hồ nghe nói về Comonad, nhưng tất cả những gì tôi thực sự biết về nó là những gì cung cấp extract :: w a -> a, tương tự như của Monad return :: a -> m a.

Điểm thưởng khi ghi chú các lần sử dụng Comonad trong "đời thực" trong mã "thực".


Tôi thực sự muốn xem sự khác biệt giữa "co" và bình thường là gì. Tôi biết đơn nguyên là gì. Vì vậy, nếu tôi biết “co” có nghĩa là gì, tôi có thể tự kết luận, comonad là gì và hiểu nó một cách sâu sắc. Câu trả lời của Alexey Romanov không làm gì trong khía cạnh đó.
Evi1M4chine

2
@ Evi1M4chine: "co" (lỏng lẻo) có nghĩa là "lật mũi tên". Đây là một hình ảnh sơ bộ về điều đó. Xem xét các hoạt động đơn nguyên: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Đảo ngược các mũi tên nguệch ngoạc và bạn sẽ có được các hoạt động comonadic: extract :: a <~ w a, extend :: (a <~ w b) -> (w a <~ w b)( extract :: w a -> a, extend :: (w a -> b) -> w a -> w b)
Dan Burton

Cảm ơn bạn @Dan Burton… vì vậy trong khi với một đơn nguyên, bạn làm việc ở “bên trong” (nhét những thứ mới và đã thay đổi vào), với một đơn nguyên, bạn làm việc ở “bên ngoài” (cuối cùng lấy mọi thứ ra hoặc chỉ để thay đổi chúng) . Quan điểm đó có đúng không? Bởi vì nó chắc chắn giúp ích rất nhiều cho sự hiểu biết sâu rộng.
Evi1M4chine

comonads có thể được sử dụng để mô hình các đồng hiệu ứng. Dưới đây là một giới thiệu tuyệt vời để coeffects: tomasp.net/coeffects
zeronone

Câu trả lời:


83

Các liên kết này có thể hữu ích:

  1. Đánh giá tự động di động là một sự hài hòa . Đặc biệt, "bất cứ khi nào bạn nhìn thấy các cấu trúc dữ liệu lớn được ghép lại với nhau từ rất nhiều phép tính nhỏ nhưng tương tự nhau, thì rất có thể chúng ta đang xử lý một điểm chung".
  2. Chuỗi, luồng và phân đoạn
  3. Dấu phẩy trong cuộc sống hàng ngày

1
+1 Liên kết đầu tiên là liên kết thực sự mang nó đến với tôi.
luqui

42
Câu trả lời chỉ liên kết ít nhất phải chứa một bản tóm tắt các nội dung được liên kết. Hiện tại câu trả lời này không phù hợp để trở thành một câu trả lời SO tốt. Cân nhắc mở rộng nó một chút, để nó có thể tự đứng vững mà không cần các bài báo liên kết.
Bakuriu

3
"Bất cứ khi nào bạn nhìn thấy các cấu trúc dữ liệu lớn được ghép lại với nhau từ rất nhiều phép tính nhỏ nhưng tương tự nhau, rất có thể chúng ta đang xử lý một sự kết hợp" .... Vậy điều đó có nghĩa là các trình tạo bóng phân đoạn là hợp lý?
Sam Kellett

Tôi tìm thấy ví dụ này của extendtrở nên hữu ích.
Chris Penner,

22

Điều này không trả lời đầy đủ câu hỏi của tôi, nhưng tôi muốn đưa một số thông tin có liên quan vào định dạng câu trả lời:

"co" (lỏng lẻo) có nghĩa là "lật các mũi tên". Đây là một hình ảnh sơ bộ về điều đó.

Xem xét các hoạt động đơn nguyên:

return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)

Đảo ngược các mũi tên nguệch ngoạc và bạn nhận được các phép toán hài hòa:

extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)

(Viết bằng mũi tên bình thường)

extract :: w a -> a
extend :: (w a -> b) -> w a -> w b

Lưu ý rằng trong định dạng này, returnmột mũi tên giống như vậy sẽ phù hợp với vị trí đối số cho flip (>>=)như thế nào và điều này cũng đúng với extractextend. Luật đơn nguyên / kết hợp nói rằng khi bạn đặt returnhoặc extractvào vị trí đó, kết quả là mũi tên nhận dạng. Luật cũng vậy, "chỉ với những mũi tên đã được lật". Đó là một câu trả lời cao siêu nhưng hy vọng nó cung cấp một số thông tin chi tiết.


2
Câu trả lời của bạn phù hợp với việc tránh ngụy biện hướng dẫn đơn nguyên. Đơn nguyên (và các cụm từ) chỉ là một giao diện. Mặc dù thực sự sẽ rất tuyệt nếu biết chúng được dự định như thế nào . Như trong: Ý tưởng đằng sau chúng.
Evi1M4chine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.