什么是bi-comonad的方法?

时间:2016-11-27 23:26:47

标签: haskell category-theory comonad bifunctor

在思考更有用的标准类时,建议to this one

class Coordinate c where
  createCoordinate :: x -> y -> c x y
  getFirst :: c x y -> x
  getSecond :: c x y -> y
  addCoordinates :: (Num x, Num y) => c x y -> c x y -> c x y

它让我觉得,而不是VectorSpace-yR2,而是一个更为一般的野兽可能潜伏在这里:Type -> Type -> Type可以提取两个包含的类型。嗯,也许他们可以 extract ed

原来,comonadbifunctors包中都没有包含Bicomonad的内容。问题是,从理论上讲,这类课程是否有意义?不像Bimonad(也没有定义,我真的不知道怎么看),一个天真的定义似乎是合理的:

class Bifunctor c => Bicomonad c where
  fst :: c x y -> x
  snd :: c x y -> y
  bidup :: c x y -> c (c x y) (c x y)

可能有法律

fst . bidup ≡ id
snd . bidup ≡ id
bimap fst snd . bidup ≡ id
bimap bidup bidup . bidup ≡ bidup . bidup

但是我发现令人不安的是bidup的结果的两个字段都包含相同的类型,而且还有很多其他的,可能是“更好”的可想象的签名。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这不是答案,但对于Bimonad,这是怎么回事?

class Biapplicative p => Bimonad p where
  (>>==) :: p a b -> (a -> b -> p c d) -> p c d

biap :: Bimonad p => p (a -> b) (c -> d) -> p a c -> p b d
biap p q = p >>== \ab cd -> q >>== \a c -> bipure (ab a) (cd c)

instance Bimonad (,) where
  (a,b) >>== f = f a b

我不知道这是非常正确/有趣,甚至是远程有用,但它从Haskell的角度来看是闻起来的。它与您的Bicomonad或类似内容相匹配吗?