在分類理論中,monad可以由兩個伴隨函數構成。特別是,如果Ç和d是類別和FⅧ:C - > d和G:d - 「ç是伴隨函子,在這個意義上,有一個雙射對應於Haskell中常見monads的伴隨函子對是什麼?
坎(FX,Y)=坎(X,GY)
每個X在ç和ÿ in D then the composition G o F:C - > C是一個monad。
一種這樣的一對伴隨函子可以通過固定型b
並採取F
和G
給予是
data F b a = F (a,b)
data G b a = G (b -> a)
instance Functor (F b) where
fmap f (F (a,b)) = F (f a, b)
instance Functor (G b) where
fmap f (G g) = G (f . g)
和HOM-集之間的雙射由討好給出(模構造函數) :
在這種情況下iso1 :: (F b a -> c) -> a -> G b c
iso1 f = \a -> G $ \b -> f (F (a,b))
iso2 :: (a -> G b c) -> F b a -> c
iso2 g = \(F (a,b)) -> let (G g') = g a in g' b
相應單子是
data M b a = M { unM :: b -> (a,b) }
instance Monad (M b) where
return a = M (\b -> (a,b))
(M f) >>= g = M (\r -> let (a,r') = f r in unM (g r') a)
我不知道這個單子的名稱應該是什麼,但它似乎像一個讀者單子,圍繞一塊過寫信息(編輯載: dbaupp中指出,評論說,這是State
單子。)
所以State
單子可以「分解」爲一對伴隨函子F
和G
的,我們可以寫
State = G . F
到目前爲止,一切都很好。
現在,我試圖找出如何分解等常見單子到對伴隨函子 - 例如Maybe
,[]
,Reader
,Writer
,Cont
- 但我不能找出對什麼伴隨函數,我們可以將它們「分解」成它們。
唯一簡單的情況似乎是Identity
單子,它可以被分解爲任意一對函子F
的和G
使得F
是逆G
(在尤其,可以只取F = Identity
和G = Identity
)。
任何人都可以點亮一下嗎?
您構建的monad是狀態monad。 – huon
啊,當然。我將把它添加到「我已經徹底改變了一個衆所周知的monad實例但沒有意識到它的時代」的列表中。 –
將monad分解成指定函數的組合並不是唯一的,事實上,對於任何monad,都有一個這樣的分解類型。可能兩種最有用的分解方法是終端和初始方法:右邊伴侶是健忘函數的那些分解方法,它們來自(1)單子的代數範疇(Eilenberg-Moore範疇)和(2)自由代數範疇對於monad(Kleisli類)。 –