【问题标题】:Is the concept of an "interleaved homomorphism" a real thing?“交错同态”的概念是真实的吗?
【发布时间】:2014-06-06 21:17:47
【问题描述】:

我需要以下几类函数:

class InterleavedHomomorphic x where
  interleaveHomomorphism :: (forall a . f a -> g a) -> x f -> x g

显然我给它起的名字在任何方面都不是任何东西的官方术语,而且上面的类型类也不是很优雅。这是一个有名字的概念,甚至是某个库中的实现吗?有没有更合理的方法?


这个函数的目的是我有一些上下文 f 来注释一些数据(FooBar 只是为了这个问题而随机示例数据结构):

data Foo f = One (f (Bar f)) | Product (f (Foo f)) (f (Foo f))
data Bar f = Zero | Succ (f (Bar f))

我想以多态的方式转换数据的上下文;通过只知道上下文之间的同态而不(必然)关心数据本身。这可以通过在上面的示例中提供 instance InterleavedHomomorphic Fooinstance InterleavedHomomorphic Bar 来完成。

【问题讨论】:

    标签: haskell functor category-theory comonad homomorphism


    【解决方案1】:

    因此,假设 fg 是正确的函子,forall a. f a -> g a 是自然转换。我们可以让它更漂亮一点:

    type f ~> g = forall a. f a -> g a
    

    像这样的自然变换让我们形成了一个 Haskell 函子类别,因此您所拥有的是一个从该类别到其他类别的函子。

    按照普通 Haskell Functors 的步骤,让x 成为一个内函子,将 Functors 映射到其他 Functors 可能是有意义的。这与您所拥有的相似但不完全相同:

    class FFunctor x where
      ffmap :: (f ~> g) -> (x f ~> x g)
    

    但是,在您的情况下,x fx g 不是函子,x f -> x g 是正常函数而不是自然转换。不过,这种模式非常接近,足以吸引人。

    考虑到这一点,x 似乎仍然是函子的一个例子,只是介于两个不同的类别之间。它从 Functor 的类别到具有不同结构的 xs 的类别。每个可能的x,如Foo,与Foo []Foo Maybe 等对象以及它们之间的转换(Foo [] -> Foo Maybe) 形成一个类别。您的 interleaveHomomorphism 函数将自然转换“提升”为这些 x-morphisms,就像 fmap“提升”正常 (a -> b) 函数为仿函数 (f a -> f b) 中的函数一样。

    是的:你的 typeclass 是一个仿函数,就像Functor,除了在两个不同的类别之间。我不知道它的具体名称,主要是因为我不知道像x 这样的结构的具体名称。

    更一般地说,我什至不确定特定名称是否有意义。在这一点上,我们可能想要一个很好的泛型仿函数类型类,它介于 any 两个类别之间。可能是这样的:

    class (Category catA, Category catB) => GFunctor f catA catB where
      gfmap :: catA a b -> catB (f a) (f b)
    

    这可能已经存在于某个库中。

    不幸的是,这种定义不同函子的特殊方法需要大量额外的新类型噪音,因为(->) 已经是一个类别。事实上,让所有类型正确排列会有点痛苦。

    因此,将其称为XFunctor 或其他名称可能是最简单的。此外,想象一下pun potential

    编辑:看起来categories 提供了这样的CFunctor 类型,但更聪明:

    class (Category r, Category s) => CFunctor f r s | f r -> s, f s -> r where
      cmap :: r a b -> s (f a) (f b)
    

    但是,我不确定这是否足够通用!我认为我们可能希望它也比种类更具多态性。

    【讨论】:

    • 果然有GFunctor这样的东西存在;确实,数学家会认为像我们在 Hask 中那样的内函子非常特殊,并且通常处理不同类别之间的函子。 Edward 参数化 class (Category r, Category t) => Functor f r t | f r -> t, f t -> r where fmap :: r a b -> t (f a) (f b)
    • @leftaroundabout:谢谢!我在category-extras 中找到了旧版本,但看起来categories 是更新、更好使用的包。
    • 我看不出fg 需要成为函子。然而,将x 视为从某种泛型存在量化态射到另一个类别的函子是有意义的。很高兴看到CFunctor 存在,但遗憾的是它没有围绕它构建的非常严格和全面的框架以便有用。我想无论如何我都必须专注于我的用例。但是这个答案是有道理的,所以我会接受它!
    • 我实际上是在尝试在 ZuriHac 恢复 categories 包。
    • @dflemstr: fg 需要成为 forall a. f a -> g a 的函子才能成为自然变换,因为这就是自然变换的定义方式。此外,这种类型的大多数简单类型函子,我认为您非常需要fmap 才能对FooBar 做任何有用的事情。
    【解决方案2】:

    Bar f 看起来像 Free Monad Free f ()

    那么Foo 是一个do 和一个或两个<-。也许从那里继续......

    【讨论】:

    • 正如我在问题中所说,我只是编造了数据类型FooBar。实际上,我正在处理非常不同的数据结构。
    【解决方案3】:

    对于它的价值,您可以将示例的简化版本改写为

    data Bar' r = Zero | Succ r
    type Bar f = fix (Bar' . f)
    

    对于每一对自然变换eta1 :: f ~> geta2 :: Bar' ~> h,我们得到一个自然变换(eta2 . eta1) :: (Bar' . f) ~> (h . g)。我们可以用显而易见的方式将这个自然变换提升到固定点上,得到fixed (eta2 . eta1) :: Bar f -> fix (h . g)。因此,当我们有 eta2 = id 时,您的“交错同态”只是这种构造的一个特例。

    总的来说,这是一个相当标准的结构(特别是对于 f 是单子或共单子的情况),尽管我不确定它是否有一个被广泛认可的特定名称。

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 2011-11-14
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      相关资源
      最近更新 更多