Haskell Monad 法则如何从 Monoid 法则推导出来?
How are Haskell Monad laws derived from Monoid laws?
内函子类别中幺半群的定律是:
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 法则?
用 the Kleisli composition operator (>=>)
.
来表述单子法则
假设k :: a -> m b
、k' :: b -> m c
、k'' :: c -> m d
(即k
、k'
、k''
是克莱斯利箭头)
- 左身份:
return >=> k = k
- 正确身份:
k >=> return = k
- 关联性:
(k >=> k') >=> k'' = k >=> (k' >=> k'')
从(>=>)
的定义可以比较直接的看出这些和你写的是等价的。而且你不需要任何花哨的图表或任何东西:这些是字面意思幺半群法则,return
作为标识,(>=>)
作为你的幺半群操作。
您在图片中显示的图表是对 monad 的另一种思考方式。您可以根据自然变换(即 join
和 return
)或组合(即 return
和 (>>=)
/ (>=>)
)等效地定义 monad。后一种方法适用于您正在寻找的幺半群思维方式。
为了从 join
-monad 法则中显示 >>=
-monad 法则,需要根据乘法 (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
法则、自然性、函数性)。
内函子类别中幺半群的定律是:
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 法则?
用 the Kleisli composition operator (>=>)
.
假设k :: a -> m b
、k' :: b -> m c
、k'' :: c -> m d
(即k
、k'
、k''
是克莱斯利箭头)
- 左身份:
return >=> k = k
- 正确身份:
k >=> return = k
- 关联性:
(k >=> k') >=> k'' = k >=> (k' >=> k'')
从(>=>)
的定义可以比较直接的看出这些和你写的是等价的。而且你不需要任何花哨的图表或任何东西:这些是字面意思幺半群法则,return
作为标识,(>=>)
作为你的幺半群操作。
您在图片中显示的图表是对 monad 的另一种思考方式。您可以根据自然变换(即 join
和 return
)或组合(即 return
和 (>>=)
/ (>=>)
)等效地定义 monad。后一种方法适用于您正在寻找的幺半群思维方式。
为了从 join
-monad 法则中显示 >>=
-monad 法则,需要根据乘法 (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
法则、自然性、函数性)。