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 Foo和instance 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 f和x 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)
但是,我不确定这是否足够普遍!我认为我们可能希望它在类型上也更具多态性.