Haskell 索引函子之和
在中,Conor McBride开发了索引函子,然后在幻灯片“总和与乘积”中描述了它们的总和和乘积(幻灯片未标记,大约90%在演示文稿中)。本幻灯片开始Haskell 索引函子之和,haskell,category-theory,Haskell,Category Theory,在中,Conor McBride开发了索引函子,然后在幻灯片“总和与乘积”中描述了它们的总和和乘积(幻灯片未标记,大约90%在演示文稿中)。本幻灯片开始 -- sum - choose between compatible structures data (:+:) :: (i ->- o) -> (i ->- o) -> (i ->- o) where L :: s x :-> (s :+: t) x R :: t x :-> (s :
-- 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
现在是不同的类型了?@chi谢谢你的指点。结果证明我错了——我的建议不起作用,不可能将不同的输入组合起来。但是,可以对输出类型使用或,从而导致构造函数@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)
幻灯片上的:+:
和:*:
类型都采用两种类型作为参数,即基本上是一对参数。我相信,如果他们采用另一种类型参数(即或),我的建议可能会奏效,如
data (:|:) :: Either (i ->- o) (j ->- o) -> (Either i j ->- o)
这种检查有效吗?我希望L::sx->(s:+:t)('Left x)
@chi我想这就是提问者想要的答案。简短的回答是:统一版本将“选择”与“重新索引”分开。建议的事情是一个特殊的重新索引,可以很容易地进行编码。(顺便说一句,我认为chi是正确的,有一种错误,但是已经修复了输出索引而不是输入索引。)我稍后会尝试写一个正确的答案,但我必须运行。如果这是为了构造逗号类别,那么原始版本看起来绝对“更正确”。