在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
i
和j
现在是哪种类型?
答案 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)