gpt4 book ai didi

haskell - 范畴论 POV 中的 Applicative Functor 定义是什么?

转载 作者:行者123 更新时间:2023-12-03 10:35:53 24 4
gpt4 key购买 nike

我能够通过以下方式将 Functor 的定义从范畴论映射到 Haskell 的定义:因为 Hask 的对象是类型,仿函数 F

  • 映射每种类型 aHask到新类型F a粗略地说,在它前面加上“F”。
  • 映射每个态射 a -> bHask到新态射 F a -> F b使用 fmap :: (a -> b) -> (f a -> f b) .

  • 到目前为止,一切都很好。现在我到 Applicative ,并且在教科书中找不到任何提及这种概念的内容。通过查看它添加到 Functor 的内容, ap :: f (a -> b) -> f a -> f b ,我试图提出我自己的定义。

    首先,我注意到自从 (->)也是一个类型,态射为 Hask也是它的对象。鉴于此,我提出应用仿函数是一种仿函数,它也可以将源类别的“箭头”对象映射到目标类别的态射。

    这是正确的直觉吗?你能提供一个更正式、更严格的定义吗?

    最佳答案

    理解应用仿函数的关键是弄清楚它们保留了什么样的结构。

    正则仿函数保留了基本的分类结构:它们映射类别之间的对象和态射,并且它们保留了类别的法则(关联性和同一性)。

    但是一个类别可能有更多的结构。例如,它可能允许定义类似于态射但采用多个参数的映射。这种映射是通过柯里化(Currying)定义的:例如,两个参数的函数被定义为一个参数返回另一个函数的函数。如果您可以定义一个表示函数类型的对象,这是可能的。通常,这个对象被称为指数对象(在 Haskell 中,它只是类型 b->c )。然后我们可以有从一个对象到指数的态射,并将其称为双参数态射。

    Haskell 中应用仿函数的传统定义是基于多个参数的映射函数的思想。但是有一个等价的定义可以将多参数函数沿不同的边界分割。您可以将这样的函数视为产品(Haskell 中的一对)到另一种类型(此处为 c)的映射。

    a -> (b -> c)  ~  (a, b) -> c

    这使我们可以将应用仿函数视为保留产品的仿函数。但产品只是所谓的单曲面结构的一个例子。

    一般来说,幺半群类别是配备张量积和单位对象的类别。例如,在 Haskell 中,这可能是笛卡尔积(一对)和单位类型 () .但是请注意,单曲面定律(结合律和单位定律)仅在同构之前有效。例如:
    (a, ())  ~  a

    然后可以将应用仿函数定义为保留单曲面结构的仿函数。特别是,它应该保护单位和产品。我们是否在应用仿函数之前或之后进行“乘法”并不重要。结果应该是同构的。

    然而,我们并不真正需要一个成熟的幺半群仿函数。我们所需要的只是两个态射(与同构相反)——一个用于乘法,一个用于单位。这种半保留幺半体结构的仿函数称为松散幺半体仿函数。因此,替代定义:
    class Functor f => Monoidal f where
    unit :: f ()
    (**) :: f a -> f b -> f (a, b)

    很容易证明 Monoidal相当于 Applicative .例如,我们可以得到 pure来自 unit反之亦然:
    pure x = fmap (const x) unit
    unit = pure ()

    应用定律简单地遵循幺半群定律(结合律和单位定律)。

    在范畴论中,幺半体结构的保持与张量强度有关,所以应用仿函数也称为强松弛幺半体仿函数。然而,在 哈斯克 ,每个仿函数都具有关于乘积的规范强度,因此该属性不会在定义中添加任何内容。

    现在,如果您熟悉将 monad 定义为内仿函数类别中的幺半群,您可能有兴趣知道应用程序同样是内仿函数类别中的幺半群,其中张量积是 Day 卷积。但这更难解释。

    关于haskell - 范畴论 POV 中的 Applicative Functor 定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35013293/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com