內函子范疇中幺半群的定律是:

Haskell monad 法則是:
左身份: return a >>= k = k a
正確身份: m >>= return = m
關聯性: m >>= (\x -> k x >>= h) = (m >>= k) >>= h
我假設后者是從前者派生的,但怎么會呢?圖表基本上說
join (join x) = join (fmap join x)
join (return x) = x
join (fmap return x) = x
這些如何等同于 Haskell monad 定律?
uj5u.com熱心網友回復:
為了>>=從join-monad 定律中顯示-monad 定律,需要x >>= y根據乘法 ( join)、統一性 ( return) 和函子性 ( fmap) 進行定義,因此我們需要讓,根據定義,
(x >>= y) = join (fmap y x)
左身份法
左恒等式則變為
return a >>= k = k a
根據 的定義>>=,它等價于
join (fmap k (return a)) = k a
現在,return是一個自然變換I -> T(I恒等函子在哪里),所以fmap_T k . return = return . fmap_I k = return . k. 我們將法律簡化為:
join (return (k a)) = k a
這是join法律規定的。
正確身份法
正確的身份法
m >>= return = m
歸結為,根據定義>>=:
join (fmap return m) = m
這正是其中的一項join法律。
我將把結合律留給你證明。它應該遵循使用相同的工具(join法律、自然性、功能性)。
uj5u.com熱心網友回復:
用 Kleisli 組合算子來表述(>=>)monad 定律。
假設k :: a -> m b,k' :: b -> m c,k'' :: c -> m d(即k,k',k''是Kleisli箭頭)
- 左身份:
return >=> k = k - 正確身份:
k >=> return = k - 關聯性:
(k >=> k') >=> k'' = k >=> (k' >=> k'')
從 的定義中(>=>)可以相對簡單地表明這些與您撰寫的內容相同。而且您不需要任何花哨的圖表或任何東西:這些實際上就是幺半群定律,具有return作為身份和(>=>)作為您的幺半群運算。
您在圖片中顯示的圖表是對 monad 的另一種思考方式。您可以根據自然轉換(即joinand return)或組合(即return和(>>=)/ (>=>))等價地定義 monad 。后一種方法適用于您正在尋找的幺半群思維方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/330328.html
