在实际使用中,相邻意味着什么?

时间:2016-09-23 15:03:58

标签: haskell monoids

在尝试理解某些概念时,我经常遇到“adjoin”一词。那些事情太抽象了,我无法理解,因为我既不是领域专家也不是范畴理论。

我找到的最简单的案例是Monoid Maybe a个实例,它的行为通常不像我在Nothing时所期望的那样。

Wikipedia我们可以了解到,通过将一个元素“连接”到一个半群,我们可以获得一个不同的Monoid实例。我不明白这句话,但给出的方程表明它正是我所需要的(并且由于某种原因不是默认的):

  

任何半群S可以简单地通过邻接不在S中的元素e并且为所有s∈S定义e•s = s = s•e而变成幺半群。

  • Doe“adjoining”的意思与“添加”的意思相同,至少在这种情况下?
  • 这个概念还有其他简单的例子吗?
  • 什么是最简单的“左 - 伴”的实例?

1 个答案:

答案 0 :(得分:8)

有时"毗邻"意味着"添加一些新东西",就像你引用的半群相关句子一样。例如。有人可能会说使用Maybe a表示将新元素Nothing添加/关联到类型a。就个人而言,我只会使用"添加"尽管如此。

这与分类意义上的邻接无关,这是一个棘手的概念。

粗略地说,假设您有一个功能类型的表单

F a -> b

其中F是从类型到类型的映射(更确切地说,是一个仿函数)。有时,您可以向上面的表单

表示同构类型
a -> G b

其中"神奇地"左侧的函数F移到右侧,更改为G

典型的例子是currying:例如

F T = (T, Int)
G T = Int -> T

然后我们

   (F a) -> b 
-- definition of F
=  (a, Int) -> b
-- currying
=~ a -> (Int -> b)
-- definition of G
=  a -> G b

在这种情况下,我们会将F -| G写为" F会与G"

保持一致。{/ 1>

每次你可以"很好地移动"对箭头另一侧的输入类型的操作,将其更改为输出类型上的另一个操作,您有一个伴随。 (从技术上讲,"很好地"意味着我们有一个自然的同构)