【发布时间】:2020-08-28 18:43:24
【问题描述】:
我刚才问this question。这是关于以下箭头定律:
arr fst . first f = f . arr fst -- (.) :: Category k => k b c -> k a b -> k a c
在 Asad Saeeduddin 帖子下的 cmets 中以 自然变换 的方式对其进行了解释。我想检查一下我的解释是否正确,并与Bartosz Milewski's article on natural transformations进行比较。
所以,自然变换的定义如下:
我们有两个类别C 和D 和仿函数F, G : C ~> D。自然变换α 是D 中的一组箭头,这样:
- 这些箭头从
F的结果指向G的结果。也就是说,对于C中的每个对象a,都存在一个箭头(在a处称为α的组件)α_a :: F a ~> G a。 - 对于每个
f :: a ~> b、a和b作为C中的对象,保持:Gf . α_a = α_b . Ff。这就是自然。
基本上,我们需要弄清楚在我们的例子中是哪四个变量:C、D、F 和 G。
据我所知:
-
C和D是同一类别的任意类型,k a b是其中的箭头,其中k是我们正在使用的Arrow实例。因此,F和G是内函子。 -
F是(, c)和G是Identity。换句话说,如果我们不再使用类型,我们将F映射到first并将G映射到id。 不考虑类型可能会更容易,因为Category和Arrow类帮助我们构造类别的箭头,而不是对象
这样对吗?
另外,Bartosz Milewski wrote those ideas down 是这样的:
fmap f . alpha = alpha . fmap f
据我所知,我们需要一个更通用的形式,因为这里alpha :: forall a. F a -> G a 只处理 Hask 作为它使用的类别。还是我错了?这张图fmap在哪个地方?
【问题讨论】:
-
我认为你的 G 和 F 是错误的,但除此之外你是对的(包括关于“
fmap”的更一般形式的东西)。arr fst的类型为k (x, c) x,而不是k x (x, c)。 -
@AsadSaeeduddin 你是对的 - 谢谢。我编辑了帖子。
-
看起来你现在的答案只是用不同的方式来表达你以前的,所以对我来说仍然是正确的。当你指定一个范畴时,你通常用它的态射来表征它,因为通常态射的规范最终决定了对象。如果我们说
C是一个“箭头类别”(就像你之前所做的那样),其中从对象a到b的态射是箭头类型k a b的成员,我们隐含地结束了指定对象是任意类型a,b, ... -
类似的经验法则适用于函子:函子的态射映射最终也指定了对象映射,因为你不能在没有定义后者的情况下编写前者。因此,除了出于美学原因之外,没有任何规定我们必须根据类型构造函数而不是它们的“fmap”操作(就像你之前所做的那样)在箭头类别上定义我们的 endofunctors。
-
为了完整起见添加答案。即使在 cmets 和编辑之间,我怀疑您现在已经基本弄清楚了。
标签: haskell functor category-theory arrows