哈斯克尔:幺半群中态射的构成

时间:2016-07-09 15:32:01

标签: haskell category-theory

我对monoidal类别类有以下定义(类似于标准库,但提供了必要的自然同构的反转):

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类别中组合态射的问题是对象可能以不同方式关联。对于instance Monoidal Hask (,) (),我们可能希望使用类型为x -> ((a, b), c)的态射来构造类型((a, ()), (b, c)) -> y的态射。为了使类型合适,必须应用bimap idrInv id . associate给出的自然同构。

Haskell类型系统是否能够根据所需的域和密码域类型自动确定适当的同构?我无法弄明白该怎么做。

1 个答案:

答案 0 :(得分:0)

我知道了,有点。基本思想是使用具有规范化功能及其反函数的多参数类型类。归一化器将所有内容递归关联到右侧。对于每个递归情况,类型类都需要一个实例。然后,要从一种将东西关联的方式转换为另一种方式,只需为第一个态的类型组成归一化器,为第二个态的类型组成逆归一化器。

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