Đặt là CCC . Hãy là một bifunctor sản phẩm trên . Vì Cat là CCC, chúng ta có thể cà ri :( × ) C ( × )
Functor loại có cấu trúc đơn hình thông thường. C ⇒ C C CMột monoid trong là một đơn nguyên trong . Chúng tôi coi các sản phẩm hữu hạn như cấu trúc monoidal trên .
Do đó bảo tồn cấu trúc đơn hình, do đó, nó vận chuyển một monoid thành một đơn nguyên và một comonoid thành một comonad. Cụ thể, nó vận chuyển một monoid tùy ý để đơn nguyên (xem định nghĩa - phải là một monoid). Tương tự như vậy, nó vận chuyển comonoid chéo đến comonad Coreader.
Bây giờ, để cụ thể, tôi mở ra việc xây dựng Nhà văn.
Bắt đầu Trên thực tế , họ chỉ đơn giản là có tên riêng biệt trong Haskell. Chúng tôi có một Haskell monoid :
Nhà văn là một functor, vì vậy nó cũng phải ánh xạ các hình thái, chẳng hạn như và . Tôi viết như sau, mặc dù nó không hợp lệ trong Haskell:
là sự chuyển hóa tự nhiên, một cấu xạ trong . Theo tính chất của nó là một hàm, lấy \ trong Ob (C) và đưa ra một hình thái trong C :
Không chính thức, khoản thành phần của loại và bơm nguyên vẹn. Đây chính xác là định nghĩa của Nhà văn trong Haskell. Một trở ngại là đối với đơn vị chúng ta cầnw một ⟨ W r i t e r w , μ , η ⟩
tức là không tương thích về các loại. Nhưng các hàm này là đẳng cấu: bởi cộng tác viên thông thường cho các sản phẩm hữu hạn là đẳng cấu tự nhiên . Sau đó, chúng tôi xác định thông qua . Tôi bỏ qua việc xây dựng thông qua .
Nhà văn, là một functor, bảo tồn các sơ đồ giao hoán, tức là bảo toàn các đẳng thức monoid, vì vậy chúng tôi đã cấp các đẳng thức đã được chứng minh cho = một monoid trong = một đơn nguyên trong . Kết thúc.
Còn về Reader và Cowriter thì sao? Trình đọc được bổ sung cho Coreader, như được giải thích trong định nghĩa của Coreader, xem liên kết ở trên. Tương tự, Cowriter được bổ sung cho Nhà văn. Tôi không tìm thấy định nghĩa về Cowriter, vì vậy tôi đã tạo ra nó bằng cách tương tự được hiển thị trong bảng:
{- base, Hackage.category-extras -}
import Control.Comonad
import Data.Monoid
data Cowriter w a = Cowriter (w -> a)
instance Functor (Cowriter w) where
fmap f (Cowriter g) = Cowriter (f . g)
instance Monoid w => Copointed (Cowriter w) where
extract (Cowriter g) = g mempty
instance Monoid w => Comonad (Cowriter w) where
duplicate (Cowriter g) = Cowriter
(\w' -> Cowriter (\w -> g (w `mappend` w')))
Dưới đây là các định nghĩa đơn giản hóa của các đơn nguyên (đồng). fr_ob F biểu thị ánh xạ của functor F trên các đối tượng, fr_mor F biểu thị ánh xạ của functor F trên các hình thái. Có một đối tượng monoid trong .
- nhà văn
- Người đọc
- Điều tra viên
- Cao bồi
Câu hỏi là sự điều chỉnh trong liên quan đến functor, không phải monads. Tôi không thấy cách điều chỉnh ngụ ý "Coreader is a comonad" "Reader is a monad" và "Writer is a monad" "Cowriter is a comonad".
Ghi chú. Tôi đang vật lộn để cung cấp thêm bối cảnh. Nó đòi hỏi một số công việc. Đặc biệt, nếu bạn yêu cầu độ tinh khiết phân loại và những (các) đơn nguyên được giới thiệu cho các lập trình viên. Hãy cằn nhằn! ;)