代码之家  ›  专栏  ›  技术社区  ›  Zazaeil

将“functor”类泛化为“multifunctor”?

  •  0
  • Zazaeil  · 技术社区  · 6 年前

    我正在学习 Free Applicative Functors “。当然,我要问的问题是,关于论文的主要观点,有点撇开不谈,但是…

    …在第6页,有一个尝试概括 Functor MultiFunctor :

    class Functor f ⇒ MultiFunctor f where
        fmap0 :: a → f a
        fmap1 :: (a → b) → f a → f b
        fmap1 = fmap
        fmap2 :: (a → b → c) → f a → f b → f c
        ...
    

    从范畴理论的观点看不出这一定义的合理性: fmap2 似乎只是一个双分支,即在 product category . 根据定义,产品类别由所有可能的有序对象对给出,并且变形也是成对的,因此: fmap2 :: (a -> a', b -> b') -> (f a, f b) -> (f a', f b') 看起来和感觉更合适的签名。

    我能理解站在 (a -> b -> c) -> f a -> f b -> f c 选择:这只是最明显的了解 (a -> b) -> f a -> f b 签名并强制它使用二进制函数,而不是一元函数。而是 多函子 (由上面的定义给出)实际上是一个二元/多元展开式的范畴理论所期望的?

    另外,我好奇的原因是它看起来像一个 不能 到达 Applicative 泛化 函子 尽管报纸上说可以。

    2 回复  |  直到 6 年前
        1
  •  6
  •   luqui    6 年前

    我认为你所采用的范畴理论的角度是错误的。有一个bifunctor类(带有类型为的映射 (a -> b) -> (c -> d) -> f a c -> f b d )但这并不是一般化。如果一个函数未被转换,那么 fmap2 看起来像:

    fmap2 :: ((a,b) -> c) -> (f a, f b) -> f c
    

    通过考虑 fmap2 id 我们看到,我们所实现的不是一个双算子,而是一个笛卡尔函数(即笛卡尔范畴之间的一个单值函数),其中 fmap2 id :: (f a, f b) -> f (a,b) 自然转化:

    \mu_{x,y} : F(x) \otimes F(y) \to F(x \otimes y)

    你就可以从中得到应用 Multifunctor 概括。只是改变 pure 对于 fmap0 (<*>) 对于 fmap2 ($) .

        2
  •  2
  •   Carl    6 年前

    让我们从显而易见的: fmap0 是纯洁的。

    这是你在以下方面犯的错误: fmap2 liftA2 .

    ( bimap 很不一样- (a -> b) -> (c -> d) -> f a b -> f c d )

    如果你回到 definition of Applicative ,您会看到它有一个默认的实现 (<*>) ,这就是 liftA2 id ,它允许您用纯和 LIFTA2 (& lt;*& gt;) .

    所以,是的,这个类等价于 应用的 .