首页 > 解决方案 > 究竟什么是幺半群同态?

问题描述

我从Monoid Morphisms、Products 和 Coproducts中阅读了有关 monoid 同态的内容,但无法 100% 理解。

作者说(强调原文):

length函数映射 fromString到 ,Int 同时保留 monoid 结构。这种以这种保留方式从一个幺半群映射到另一个幺半群的函数称为幺半群同态。一般来说,对于幺半群MN、同态f: M => N和所有值 x:My:M,以下等式成立:

f(x |+| y) == (f(x) |+| f(y))

f(mzero[M]) == mzero[N]

他的意思是,由于数据类型StringInt是幺半群,并且函数length映射String => Int保留了幺半群结构(Int是一个幺半群),所以它被称为幺半群同态,对吧?

标签: scalahaskellfunctional-programmingcategory-theorymonoids

解决方案


他的意思是,数据类型 String 和 Int 是幺半群。

,幺半群String也不是。Int一个幺半群是一个三元组(S, ⊕, e),其中 ⊕ 是一个二元算子⊕ : S×S → S,使得对于所有元素a, b, c∈S它满足(a⊕b)⊕c =a⊕(b⊕c),并且e∈S是一个“身份元素”,使得a⊕e=e⊕a=aString并且Int是类型,所以基本上是一组值,但不是三元组。

文章说:

让我们以String连接Int加法为例,作为具有关系的幺半群。

所以作者也清楚地提到了二元运算符((++)在 的情况下String(+)在 的情况下Int)。身份(在String0的情况下为空字符串Int)是隐含的;在非正式的英语话语中,将身份作为练习留给读者是很常见的。

现在假设我们有两个幺半群结构(M, ⊕, e m )(N, ⊗, e n ),函数f : M → N (like length) 被称为幺半群同态[wiki],因为它认为f (m 1 ⊕m 2 )=f(m 1 ) ⊗f(m 2 )对于所有元素m 1 , m 2 ∈M并且该映射还保留了单位元素:f( em ) = en 。

例如length :: String -> Int是幺半群同态,因为我们可以考虑幺半群( String, (++), "")( Int, (+), 0)。它认为:

  1. length (s1 ++ s2) == length s1 + length s2(对于所有Stringss1s2);和
  2. length "" == 0.

推荐阅读