什么是同态?

zer*_*ing 4 math haskell

Homo意味着Haskell中的等同和同态是关于保留结构.

例如,fmap类别仿函数的函数保留了结构.

同态是什么意思呢?

Typ*_*ats 7

根据nLab,同态是两个代数(基础集)之间的函数,它保留了代数结构.

什么是"代数结构?"

摘要代数研究法则定义的代数.例如,幺半群体体现了相关性和身份的观念,而群体则增加了可逆性的概念.代数的公理和定律也被称为"代数结构".令人困惑的是,代数本身也被称为"代数结构"

组的示例是添加的整数集,其中标识为0,反之为-x.组的另一个例子是乘法下的非零有理数的集合,其中标识为1而逆是1/x.

现在,让我们来看看群体同态.

设(G,*,e)表示G是载波集合的组,*是操作,e是标识元素.设F是从组(G,*,e)到组(G',*',e')的组同态,并且令f是从G到G'的基础函数.

  • f(a*b)= fa*'fb
  • fe = e'

(注意,逆的保留遵循上述法则.)

这就是群体"保留结构"的含义.

对于环,必须保留环结构,以此类推其他代数结构.

请参阅此Math Stack Exchange答案.

现在,Haskell怎么样?

首先,类别由这些对象之间的对象态射组成.这些态射可以相关联地组合,并且每个对象具有身份态射,即构成下的身份元素.

仿函数是类别之间的态射.在Haskell的上下文中,仿函数是一个endofunctor(一个endomorphism映射到自己的东西),从Hask到Hask*.类型构造函数映射Hask的对象(Haskell类型)并fmap映射态射(Haskell函数).函子必须保留身份和构成的类别结构,因此函子法则:

  • fmap (g . f) = (fmap g) . (fmap f)
  • fmap id = id

*请注意,Hask在存在时违反了法律seq,因此它实际上不是一个类别.


dan*_*iaz 5

Haskell 类型不仅仅是孤立值的集合;它们可以具有组合相同类型的两个元素并返回该类型的另一个元素的操作。例如String++Natural+*Bool&&||

这些操作可能满足也可能不满足某些属性。例如,关联属性(满足前面提到的所有操作)或交换属性(列表追加++不满足)。有时,一个属性涉及两个不同的操作,例如与+和相关的分配律*

假设我们有两种不同的类型,还有两种不同的操作,每种类型一个。例如String++在一侧上,并Natural+另一方。操作是不同的,但是如果我们眯起眼睛,我们会看到它们都满足关联性。

现在,如果我们能找到一个将String值转换为Natural值的函数,这样+转换两个Strings 的结果总是等于转换++原始Strings 的结果呢?这比简单地找到任何类型的函数要困难得多String -> Natural。它必须是一个在移动到另一端时保留操作结果的函数。这两种类型之间的这个函数称为同态

例如,该函数length :: String -> Natural是同态的。两个字符串的串联长度等于原始长度之和。像lengthbut 为空列表分配非零值的函数不是有效的同态。

请注意,同态可以“消除”源类型中存在的差异。例如length,为"foo"和分配相同的数字"bar"

另一个例子:一方面考虑类型FilePath和操作</>(我们只考虑相对文件夹路径),另一方面考虑类型IO ()和操作>>。那么该函数setCurrentDirectory :: FilePath -> IO ()是同态的。请注意,IO ()例如 的值putStrLn "foo"不代表“更改文件夹”效果并且永远不会被 “定位” setCurrentDirectory。这不会发生在lenght,其中每个Natural都是lenght某个String或另一个的 。