Haskell: 单子范畴中态射的复合

4
我有一个关于单子范畴类的定义(类似于标准库,但提供必要自然同构的反元素):
class (Category r, Category s, Category t) => Bifunctor p r s t | p r -> s t, p s -> r t, p t -> r s where
  bimap :: r a b -> s c d -> t (p a c) (p b d)
--
class (Bifunctor b k k k) => Associative k b where
  associate :: k (b (b x y) z) (b x (b y z))  
  associateInv :: k (b x (b y z)) (b (b x y) z)
--
class (Bifunctor b k k k) => HasIdentity k b i | k b -> i
class (Associative k b, HasIdentity k b i) => Monoidal k b i | k b -> i where
  idl :: k (b i a) a
  idr :: k (b a i) a
  idlInv :: k a (b i a)
  idrInv :: k a (b a i)
--

使用 (.) 在一个融合范畴中组成态射的问题在于对象可能有不同的关联方式。例如,对于 Monoidal Hask (,) (),我们可能希望将类型为 x -> ((a, b), c) 的态射与类型为 ((a, ()), (b, c)) -> y 的态射组合。为了使类型匹配,必须应用给定的自然同构 bimap idrInv id . associate
Haskell 类型系统是否可以自动确定适当的同构,基于所需的起始和终止类型?我无法解决这个问题。
1个回答

0

我想出来了,有点意思。基本思路是使用一个带有归一化函数和其逆函数作为方法的多参数类型类。归一化器递归地将所有内容关联到右侧。类型类需要递归情况的每种情况的实例。然后,要从一种方式转换为另一种方式,只需组合第一个态射类型的归一化器和第二个态射类型的逆归一化器。

我将在发布代码后立即在此处链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接