g a)-6ren">
gpt4 book ai didi

haskell - "interleaved homomorphism"的概念是真的吗?

转载 作者:行者123 更新时间:2023-12-03 22:16:53 25 4
gpt4 key购买 nike

我需要以下类别的功能:

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 Foo 来完成。和 instance InterleavedHomomorphic Bar在上面的例子中。

最佳答案

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

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

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

按照普通 Haskell 仿函数的步骤,使用 x 可能是有意义的。是一个内仿函数,将仿函数映射到其他仿函数。这与您所拥有的相似但不完全相同:
class FFunctor x where
ffmap :: (f ~> g) -> (x f ~> x g)

但是,在您的情况下 x fx g不是仿函数, x f -> x g是一个正常的函数,而不是一个自然的变换。尽管如此,该模式仍然足够接近以引起人们的兴趣。

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

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

更一般地说,我什至不确定一个特定的名字是否有意义。在这一点上,我们可能想要一个很好的泛型仿函数类型类,它可以介于任何两个类别之间。也许是这样的:
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)

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

关于haskell - "interleaved homomorphism"的概念是真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24090758/

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