gpt4 book ai didi

haskell - 各个角度的单子(monad)——数学的、图表的和程序化的

转载 作者:行者123 更新时间:2023-12-03 14:55:35 27 4
gpt4 key购买 nike

我试图将 Monad 的分类定义与我在其他一些教程/书籍中看到的其他一般表示/定义相协调。
下面,我(也许是强行)试图使这两个定义接近,请指出错误并在需要时提供更正
所以从 Monad 的定义开始

Monads are just monoids in the category of endofunctors.


并且对 endofunctors 有一点了解,我假设 Monad 可以写成
((a->b)->Ma->Mb)->((b->c)->Mb->Mc) 
' Type ' 的 LHS(左侧)是 Mb , RHS 的类型是 Mc ,所以我想我可以写如下
Mb-> (b->c)-> Mc, **which is how we define bind**
这就是我如何看待内引子类别中的Monads(它们本身在 Category C中,' types'作为 objects)
Monad Visually .
这有什么意义吗?

最佳答案

嗯,我觉得你有点不对劲。 monad 是一个 endofunctor,在 Hask(Haskell 类型的类别)中是一种 F :: * -> *一些函数知道如何将态射(函数)注入(inject)到 Hask 的子类别中,函数在 F 上s 作为态射和 F s 作为对象,fmap .你所拥有的似乎是 Hask 中的自然转变。

示例:Maybe , Either a , (,) a , ETC..

现在一个 monad 也必须有 2 个自然变换(Functor F, Functor g => F a -> G a in hask)。

n : Identity -> M
u : M^2 -> M

或者在haskell代码中
n :: Identity a -> M a -- Identity a == a
u :: M (M a) -> M a

对应于 returnjoin分别。

现在我们必须到达 >>= .你所拥有的绑定(bind)实际上只是 fmap ,我们真正想要的是 m a -> (a -> m b) -> m b .这很容易定义为
 m >>= f = join $ f `fmap` m

多田!我们有单子(monad)。现在对于这个内仿函数的幺半群。

内仿函数上的幺半群将仿函数作为对象,自然变换作为态射。有趣的是,两个内仿函数的乘积是它们的组合。这是我们新的 monoid 的 Haskell 代码
type (f <+> g) a = f (g a)
class Functor m => Monoid' m where
midentity' :: Identity a -> m a
mappend' :: (m <+> m) a -> m a

这对
 midentity' :: a -> m a
mappend' :: m (m a) -> m a

看起来熟悉?

关于haskell - 各个角度的单子(monad)——数学的、图表的和程序化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18928176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com