我有一个关于单子范畴类的定义(类似于标准库,但提供必要自然同构的反元素):
使用
Haskell 类型系统是否可以自动确定适当的同构,基于所需的起始和终止类型?我无法解决这个问题。
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 类型系统是否可以自动确定适当的同构,基于所需的起始和终止类型?我无法解决这个问题。