索引函子的总和

时间:2017-01-02 04:31:13

标签: haskell category-theory

Slicing It中,Conor McBride开发了索引编写器,然后在幻灯片“Sum and Product”中描述了它们的总和和产品(幻灯片未标记,大约90%在演示文稿中)。此幻灯片开始

-- sum - choose between compatible structures
data (:+:) :: (i ->- o) -> (i ->- o) -> (i ->- o) where
    L :: s x :-> (s :+: t) x
    R :: t x :-> (s :+: t) x
instance (IFunctor s, IFunctor t) => IFunctor (s :+: t) where
    imap f (L sx) = L (imap f sx)
    imap f (R tx) = R (imap f tx)

特别是,:+:的这个定义要求两个索引编写器都具有相同的源索引i。我想知道为什么会这样。这可以放宽,例如允许

-- sum - choose between compatible structures
data (:+:) :: (i ->- o) -> (j ->- o) -> (Either i j ->- o) where
    L :: s x :-> (s :+: t) x
    R :: t x :-> (s :+: t) x

ij现在是哪种类型?

1 个答案:

答案 0 :(得分:0)

@chi感谢您的指针。事实证明我错了 - 我的建议不起作用,不可能组合不同的输入。但是,可以使用Either作为输出类型,从而导致构造函数@chi建议:

data (:+:) :: (i ->- o) -> (i ->- u) -> (i ->- Either o u) where
    L :: s x o -> (s :+: t) x ('Left o)
    R :: t x u -> (s :+: t) x ('Right u)

幻灯片上的:+::*:类型都有两种类型作为参数,即基本上是一对参数。我相信如果他们采用替代(即Either)类型参数,我的建议可能会有效,如

data (:|:) :: Either (i ->- o) (j ->- o) -> (Either i j ->- o)