在尝试理解某些概念时,我经常遇到“adjoin”一词。那些事情太抽象了,我无法理解,因为我既不是领域专家也不是范畴理论。
我找到的最简单的案例是Monoid Maybe a
个实例,它的行为通常不像我在Nothing
时所期望的那样。
从Wikipedia我们可以了解到,通过将一个元素“连接”到一个半群,我们可以获得一个不同的Monoid
实例。我不明白这句话,但给出的方程表明它正是我所需要的(并且由于某种原因不是默认的):
任何半群S可以简单地通过邻接不在S中的元素e并且为所有s∈S定义e•s = s = s•e而变成幺半群。
答案 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
"
每次你可以"很好地移动"对箭头另一侧的输入类型的操作,将其更改为输出类型上的另一个操作,您有一个伴随。 (从技术上讲,"很好地"意味着我们有一个自然的同构)