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
    是一个“箭头类别”(就像你所做的那样)