Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 索引函子之和_Haskell_Category Theory - Fatal编程技术网

Haskell 索引函子之和

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 :

在中,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 :+: 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是正确的,有一种错误,但是已经修复了输出索引而不是输入索引。)我稍后会尝试写一个正确的答案,但我必须运行。如果这是为了构造逗号类别,那么原始版本看起来绝对“更正确”。