scala - 究竟什么是幺半群同态?
问题描述
我从Monoid Morphisms、Products 和 Coproducts中阅读了有关 monoid 同态的内容,但无法 100% 理解。
作者说(强调原文):
该
length
函数映射 fromString
到 ,Int
同时保留 monoid 结构。这种以这种保留方式从一个幺半群映射到另一个幺半群的函数称为幺半群同态。一般来说,对于幺半群M
和N
、同态f: M => N
和所有值x:M
、y:M
,以下等式成立:f(x |+| y) == (f(x) |+| f(y)) f(mzero[M]) == mzero[N]
他的意思是,由于数据类型String
和Int
是幺半群,并且函数length
映射String => Int
保留了幺半群结构(Int
是一个幺半群),所以它被称为幺半群同态,对吧?
解决方案
他的意思是,数据类型 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=a。String
并且Int
是类型,所以基本上是一组值,但不是三元组。
文章说:
让我们以
String
连接和Int
加法为例,作为具有关系的幺半群。
所以作者也清楚地提到了二元运算符((++)
在 的情况下String
和(+)
在 的情况下Int
)。身份(在String
和0
的情况下为空字符串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
)。它认为:
length (s1 ++ s2) == length s1 + length s2
(对于所有String
ss1
和s2
);和length "" == 0
.
推荐阅读
- flask - 将烧瓶邮件与 Amazon SES 一起使用
- javascript - 来自 React 类组件的 Memoize 回调作为闭包
- apache - 如何配置 Apache 以避免将多个斜杠 (/) 重定向到单个斜杠
- wpf - 如何使更改的列数填充整个宽度并在 WPF 中水平居中?
- python - 如何创建有向图?
- python - 使用 Databricks 将文件从 Azure Blob 存储上传到 SFTP 位置?
- angular - ag-grid 正在添加带有列定义的硬编码 _1
- ansible - 将两个版本号与 ansible 中的版本进行比较
- woocommerce - 为 /orders 端点扩展 Woocommerce Rest API 类和更改架构
- javascript - Discord.js - 我正在尝试创建一个不和谐机器人,它将语音通道中的所有连接成员静音