Định nghĩa "Monads chỉ là monoids trong danh mục endofunctors.", Mặc dù đúng là một nơi tồi tệ để bắt đầu. Đó là từ một số blog post được dự định là trò đùa. Nhưng nếu bạn quan tâm đến sự tương ứng, nó có thể được thể hiện trong Haskell:
Mô tả laymen của một thể loại là một bộ sưu tập trừu tượng các đối tượng và hình thái giữa các đối tượng. Ánh xạ giữa các danh mục được gọi là functors và các đối tượng bản đồ cho các đối tượng và hình thái đối với hình thái liên quan và bảo tồn danh tính. An endofunctor là một hàm từ một danh mục cho chính nó.
{-# LANGUAGE MultiParamTypeClasses,
ConstraintKinds,
FlexibleInstances,
FlexibleContexts #-}
class Category c where
id :: c x x
(.) :: c y z -> c x y -> c x z
class (Category c, Category d) => Functor c d t where
fmap :: c a b -> d (t a) (t b)
type Endofunctor c f = Functor c c f
Mappings giữa functors đáp ứng cái gọi là naturality conditions được gọi là biến đổi tự nhiên. Trong Haskell đây là những chức năng đa hình của loại: (Functor f, Functor g) => forall a. f a -> g a
.
Một đơn nguyên trên một loại C
là ba điều (T,η,μ)
, T
là endofunctor và 1
là functor nhận dạng trên C
. Mu và eta là hai biến đổi tự nhiên mà đáp ứng một bản sắc triangle identity và một associativity, và được định nghĩa là:
Trong Haskell μ
là join
và η
là return
return :: Monad m => a -> m a
join :: Monad m => m (m a) -> m a
Một định nghĩa phân loại của Monad trong Haskell có thể được viết:
class (Endofunctor c t) => Monad c t where
eta :: c a (t a)
mu :: c (t (t a)) (t a)
Nhà điều hành ràng buộc có thể được bắt nguồn từ những.
(>>=) :: (Monad c t) => c a (t b) -> c (t a) (t b)
(>>=) f = mu . fmap f
Đây là một định nghĩa đầy đủ, nhưng tương đương bạn cũng có thể cho thấy rằng luật Monad có thể được diễn tả như luật monoid với một loại functor. Chúng ta có thể xây dựng thể loại functor này là một thể loại với các đối tượng như functors (tức là ánh xạ giữa các loại) và các phép biến đổi tự nhiên (tức là ánh xạ giữa các functors) như là các hình thái. Trong một thể loại của endofunctors tất cả các functors là functors giữa cùng một loại.
newtype CatFunctor c t a b = CatFunctor (c (t a) (t b))
Chúng tôi có thể hiển thị này làm phát sinh một loại với thành phần functor như thành phần cấu xạ:
-- Note needs UndecidableInstances to typecheck
instance (Endofunctor c t) => Category (CatFunctor c t) where
id = CatFunctor id
(CatFunctor g) . (CatFunctor f) = CatFunctor (g . f)
Các monoid có định nghĩa thông thường:
class Monoid m where
unit :: m
mult :: m -> m -> m
Một monoid trên một danh mục của functors có một biến đổi tự nhiên như là một bản sắc và một phép toán nhân kết hợp các biến đổi tự nhiên. Thành phần Kleisli có thể được định nghĩa để thỏa mãn luật nhân.
(<=<) :: (Monad c t) => c y (t z) -> c x (t y) -> c x (t z)
f <=< g = mu . fmap f . g
Và như vậy bạn có nó "Monads chỉ monoids trong danh mục của endofunctors" mà chỉ là một "pointfree" phiên bản của định nghĩa bình thường của monads từ endofunctors và (mu, eta).
instance (Monad c t) => Monoid (c a (t a)) where
unit = eta
mult = (<=<)
Với một chút thay ai có thể chứng minh rằng các đặc tính của monoidal (<=<)
Are tuyên bố tương đương của tam giác và associativity sơ đồ cho biến đổi tự nhiên của đơn nguyên.
f <=< unit == f
unit <=< f == f
f <=< (g <=< h) == (f <=< g) <=< h
Nếu bạn quan tâm đến diagrammatic representations Tôi đã viết một chút về việc thể hiện chúng bằng sơ đồ chuỗi.
aah, Monad là endofuctor, làm cách nào tôi bỏ lỡ điều đó. Giờ thì rõ ràng, cảm ơn. –