zer*_*ing 60 haskell functional-programming scala category-theory monoids
我已经从Monoid Morphisms,Products和Coproducts中阅读了有关Monoid同态的知识,并且无法理解100%。
作者说(强调原文):
该
length
函数从映射到String
,Int
同时保留类半体结构。这种以一种保存方式从一个单半体映射到另一个单半体的函数称为单半体同态。通常,对于monoidM
和N
,是同态f: M => N
,以及所有值x:M
,y:M
以下等式成立:Run Code Online (Sandbox Code Playgroud)f(x |+| y) == (f(x) |+| f(y)) f(mzero[M]) == mzero[N]
他的意思是说,由于数据类型String
和Int
是monoid ,并且函数length
映射String => Int
保留了monoid结构(Int
是monoid),所以称为monoid同态,对吗?
Wil*_*sem 72
他的意思是,数据类型String和Int是monoid。
不,String
也不Int
是monoid。一个单面体是一个三元组(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(米2)为所有元素中号1,米2 ∈M和该映射还保留了身份元素:F(è 米)= E ñ。
例如length :: String -> Int
是幺同态,因为我们可以考虑类群(String
,(++)
,""
)和(Int
,(+)
,0
)。它认为:
length (s1 ++ s2) == length s1 + length s2
(对于所有String
s s1
和s2
);和length "" == 0
。slo*_*ouc 19
数据类型本身不能是monoid。对于一个monoid,您需要一个数据类型T
和另外两件事:
|+|
,它接受两个type元素,T
并产生一个type元素T
T
i
t
T
t |+| i = i |+| t = t
这是一个monoid的例子:
类半同态
通过将字符串并置的monoid应用于.length
其所有元素,可以将其转换为整数加法的monoid 。这两个集合都构成一个半体。顺便说一句,请记住,我们不能只说“一组整数构成一个单半体”。我们必须选择一个关联操作和一个相应的标识元素。如果将除法作为运算,则会打破第一条规则(而不是生成整数类型的元素,而可能会生成float / double类型的元素)。
方法length
使我们能够从一个monoid(字符串串联)转到另一个monoid(整数加法)。如果这样的操作还保留了类单态结构,则认为它是一个类单态同态。
保留结构意味着:
length(t1 |+| t2) = length(t1) |+| length(t2)
and
length(i) = i'
Run Code Online (Sandbox Code Playgroud)
其中t1
和t2
代表“源” monoid的元素,是“源” monoid i
的标识,并且i'
是“目标” monoid的标识。您可以自己尝试一下,看看length
确实是对字符串串联Monoid的保留结构的操作,而例如,indexOf("a")
则不是。
类半同构
如所示,length
将所有字符串映射到其对应的整数,并形成一个以加法运算为运算符和以零作为标识的Monoid。但是我们不能返回-对于每个字符串,我们都可以计算出它的长度,但是在给定长度的情况下,我们无法重构“原始”字符串。如果可以的话,“前进”的操作与“前进”的操作相结合,将形成一个单面体同构。
同构意味着能够来回往返而不会丢失任何信息。例如,如前所述,列表在附加为操作和空列表作为标识元素的情况下形成一个monoid。我们可以从“附加列表下的” monoid转到“附加矢量下的” monoid,然后返回而不会丢失任何信息,这意味着运算.toVector
和.toList
一起形成同构。鲁纳尔在课文中提到的同构的另一个例子是String
?List[Char]
。