"交错同态"的概念是真实的吗?

dfl*_*str 14 haskell functor category-theory comonad homomorphism

我需要以下类功能:

class InterleavedHomomorphic x where
  interleaveHomomorphism :: (forall a . f a -> g a) -> x f -> x g
Run Code Online (Sandbox Code Playgroud)

显然,我为它发明的名称绝不是任何东西的官方术语,上面的类型不是很优雅.这是一个在某些库中有名称甚至实现的概念吗?有没有更合理的方法呢?


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

data Foo f = One (f (Bar f)) | Product (f (Foo f)) (f (Foo f))
data Bar f = Zero | Succ (f (Bar f))
Run Code Online (Sandbox Code Playgroud)

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

Tik*_*vis 17

因此,假设f并且g是适当的仿函数,forall a. f a -> g a是一种自然的转变.我们可以让它更漂亮一点:

type f ~> g = forall a. f a -> g a
Run Code Online (Sandbox Code Playgroud)

像这样的自然变换让我们形成了一个Haskell Functors的类别,所以你拥有的是从那个到其他类别的仿函数.

按照普通的Haskell Functors的步骤,有可能x成为一个endofunctor,将Functors映射到其他Functors.这与您所拥有的相似但不完全相同:

class FFunctor x where
  ffmap :: (f ~> g) -> (x f ~> x g)
Run Code Online (Sandbox Code Playgroud)

然而,在你的情况x fx g不仿函数,并且x f -> x g是一个正常的功能,而不是自然转化.尽管如此,这种模式还是足够吸引人.

考虑到这一点,它似乎x仍然是一个仿函数的例子,只是在两个不同的类别之间.它从Functors类别到x具有不同结构的s 类别.每个可能的x,像Foo,形成一个类别与对象Foo []Foo Maybe和它们之间的转换(Foo [] -> Foo Maybe).你的interleaveHomomorphism函数将"自然变换"提升到这些变换中x-morphisms,就像将fmap"提升"normal(a -> b)函数"升级" 到函子(f a -> f b)的图像中的函数一样.

所以是的:你的类型类似于一个仿函数Functor,除了两个不同的类别之外.我不知道它的具体名称,主要是因为我不知道像这样的结构的具体名称x.

更一般地说,我甚至不确定具体名称是否有意义.在这一点上,我们可能想要一个很好的通用仿函数类型类,介于任何两个类别之间.也许是这样的:

class (Category catA, Category catB) => GFunctor f catA catB where
  gfmap :: catA a b -> catB (f a) (f b)
Run Code Online (Sandbox Code Playgroud)

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

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

因此,将它称为一种XFunctor或类似的东西可能是最容易的.此外,想象一下双关语!

编辑:它看起来像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)
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否足够普遍!我认为我们可能希望它在类型上也更具多态性.

  • 果然存在像'GFunctor`这样的东西; 事实上,数学家会考虑像我们在**Hask**中那样的endofunctors,这非常特殊,并且_usually_处理不同类别之间的函子.Edward参数化[`class(Category r,Category t)=> Functor frt | fr - > t,ft - > r`](http://hackage.haskell.org/package/categories-1.0.6/docs/Control-Categorical-Functor.html)`其中fmap :: rab - > t( fa)(fb)`. (3认同)
  • 我实际上正在玩ZuriHac的'categories`包复活. (2认同)