Kei*_*son 11 monads functor category-theory applicative monoids
也许这些陈述都不是绝对精确的,但是monad通常被定义为"endofunctors类别中的monoid"; Haskell Alternative被定义为"应用函子上的一个幺半群",其中一个应用函子是一个"强疏松的幺正函子".现在这两个定义听起来非常类似于无知(我),但工作方式有很大不同.替代的中性元素具有类型f a,因此是"空的",并且对于monad具有类型a -> m a,因此具有"非空"的意义; 替代的操作有类型f a -> f a -> f a,monad的操作有类型(a -> f b) -> (b -> f c) -> (a -> f c).在我看来,真正重要的细节在于内部导向器与内部导向器的类别,尽管替代方案中的"强疏 "细节可能很重要; 但这就是我感到困惑的地方,因为至少在Haskell中,monad最终成为替代品:我发现我还没有对这里的所有细节有一个明确的分类理解.
怎么能准确地说明替代和monad之间的区别是什么,这样它们都是与endofunctors有关的幺半群,然而一个人有一个"空"中立而另一个有一个"非空"中性元素?
Bar*_*ski 21
通常,幺半群是在幺半群类别中定义的,幺半群类别是定义对象和单位对象的某种(张量)乘积的类别.
最重要的是,类型类别为monoidal:类型的产品a,并b仅仅是一种对(a, b),单位类型().
然后将一个monoid定义为m具有两个态射的对象:
eta :: () -> m mu :: (m, m) -> m
请注意,eta只需选择一个元素m,因此它等同于mempty,并且curried mu成为mappend通常的Haskell Monoid类.
所以这是一类类型和函数,但也有一个单独的endofunctors和自然转换类别.它也是一个幺半群.两个仿函数的张量积被定义为它们的组成Compose f g,而单位是身份仿函数Id.该类别中的幺半群是monad.和以前一样,我们选择一个对象m,但现在它是一个endofunctor; 和两个态射,现在是自然变换:
eta :: Id ~> m mu :: Compose m m ~> m
在组件中,这两个自然变换成为:
return :: a -> m a join :: m (m a) -> m a
应用仿函数也可以被定义为仿函数类别中的幺半群,但是具有称为日卷积的更复杂的张量积.或者,等效地,它可以被定义为(松散地)保留幺半群结构的仿函数.
Alternative是一类类型的幺半群(不是endofunctors).该系列由应用仿函数生成f.对于每种类型,a我们都有一个monoid,它mempty是一个元素,f a并且它的元素mappend对应的f a元素f a.这些多态函数被称为empty和<|>.
特别是,empty必须是多态值,意味着每种类型都有一个值a.例如,这对于列表仿函数是可能的,其中空列表是多态的a,或者对于Maybe多态值Nothing.请注意,这些都是具有不依赖于类型参数的构造函数的多态数据类型.直觉是,如果您将仿函数视为容器,则此构造函数会创建并清空容器.空容器是自动多态的.