Haskell “arr fst”是如何自然转化的?
我刚才问过。这是关于以下箭头定律:Haskell “arr fst”是如何自然转化的?,haskell,functor,category-theory,arrows,Haskell,Functor,Category Theory,Arrows,我刚才问过。这是关于以下箭头定律: arr fst . first f = f . arr fst -- (.) :: Category k => k b c -> k a b -> k a c 在帖子下面的评论中,作者用自然转化的方式解释了它。我想检查一下他们的解释是否正确,并与他们的解释进行比较 因此,自然变换的定义如下: 我们有两个类别C和D以及函子F,G:C~>D。自然变换α是D中的一系列箭头: 这些箭头从F的结果转到G的结果。也就是说,对于C中的每个对象a,都存在一
arr fst . first f = f . arr fst -- (.) :: Category k => k b c -> k a b -> k a c
在帖子下面的评论中,作者用自然转化的方式解释了它。我想检查一下他们的解释是否正确,并与他们的解释进行比较
因此,自然变换的定义如下:
我们有两个类别C
和D
以及函子F,G:C~>D
。自然变换α
是D
中的一系列箭头:
F
的结果转到G
的结果。也就是说,对于C
中的每个对象a
,都存在一个箭头(在a
处称为α的分量)
f::a~>b
,a
和b
都是C
中的对象,保持:Gf。αa=αb。Ff
。这就是自然性C
、D
、F
和G
据我所知:
和C
是任意类型的同一类别,D
是其中的箭头,其中kab
是我们正在处理的k
实例。因此,箭头
和F
是内函子G
是F
,(,c)
是G
。换句话说,如果我们不再使用类型,我们将身份
映射为F
和first
映射为G
。不从类型的角度思考可能会更容易,因为id
和类别
类帮助我们构造类别的箭头,而不是对象箭头
fmap f . alpha = alpha . fmap f
fmap f . alpha = alpha . fmap f
就我所知,我们需要一个更通用的表单来实现我们的目的,如这里的
alpha::forall a。F a->G a
仅将Hask作为其工作的类别处理。还是我错了?fmap
在这张图片中的哪个位置?您不需要担心额外的类别,因为arr fst
不涉及任意的箭头,只涉及它的(,)
实例
在Haskell中,对于某些函子f
和c
,类型为fa->ga
的函数是一种自然变换。在arr-fst::(b->c)->(b,c)
的情况下,让f-b
和g-b
据我所知:
C
和D
是任意类型的同一类别,kab
是其中的箭头,其中k
是我们正在处理的箭头
实例。
因此,F
和G
是内函子
F
是(,c)
,G
是身份
。换句话说,如果我们不再使用类型,我们将F
映射为first
和G
映射为id
。
[……]
是的,就是这样。在arr fst::k(b,c)b
中对k
和c
的每一个选择都给了我们一个(,c)
内函子和k
范畴中的身份函子之间的自然转换。专业化的实施给了我们一个更明显的特征,即自然转型:
arr @K (fst @_ @C) :: forall b. K (b, C) b
而且,
就像这样:
fmap f . alpha = alpha . fmap f
fmap f . alpha = alpha . fmap f
就我所知,我们需要一个更一般的形式来满足我们的目的
这里alpha::对于所有a。F a->G a
仅作为
它所使用的类别。还是我错了?fmap
在哪个地方
这张照片
也对fmap
必须被涉及函子的任何适当态射映射所取代。在您的示例中,正如您之前所注意到的,这些恰好是first
和id
,这使我们回到了我们开始时的箭头定律
(至于替换fmap
,函子
的方法,它从特定的函子态射映射中抽象出一个更一般的类比,这需要做出适当的安排,以便我们可以在Haskell代码中表示涉及非Hask
类别的函子。您可能想看看如何处理和处理这是什么意思“arr fst
不涉及任意的箭头,只涉及它的(,)
实例”?arr
在其签名中有一个约束类型Arrow a=>a
,但是arr fst
返回的函数没有。说实话,我对此深表怀疑。此外,当我输入:t arr fst
:arr fst::Arrow a=>a(c,b)c
时,这里是GHCi告诉我的(b,c)
type to be unhabited as(b->c)->BC
不是重言式(检查b=False
和c=True
)。直觉可能是我们无法在一般情况下应用函数参数。但我可能只是误解了你的答案(可能就是这样)你能再解释一下吗?我想你的G和F是错误的,但除此之外你是对的(包括关于“更一般形式的fmap
”的东西)。arr fst
有类型k(x,c)x
,而不是kx(x,c)
@AsadSaeeduddin你说得对-谢谢。我编辑了这篇文章。你现在的答案似乎只是用一种不同的方式来表达你以前的答案,所以我觉得它仍然是正确的。当你指定一个类别时,你通常通过它的态射来描述它,因为通常态射的规范最终决定了对象。如果我们说C
是一个“箭头类别”(就像你所做的那样)