什么是bi-comonad的方法?

lef*_*out 11 haskell category-theory comonad bifunctor

虽然沉思什么更有用的标准类建议这一个

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
Run Code Online (Sandbox Code Playgroud)

它发生我,而不是其他VectorSpace-y或者R2,一个较为普遍的野兽可能潜伏在这里:一Type -> Type -> Type,其两个包含类型都可以提取.嗯,也许他们可以extract编辑

事实证明,comonad也没有bifunctors包含一些叫做的东西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)
Run Code Online (Sandbox Code Playgroud)

可能与法律有关

fst . bidup ? id
snd . bidup ? id
bimap fst snd . bidup ? id
bimap bidup bidup . bidup ? bidup . bidup
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

dfe*_*uer 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
Run Code Online (Sandbox Code Playgroud)

我不知道这是否绝对正确/有趣,或者甚至有点有用,但从 Haskell 的角度来看,它闻起来很正确。它与您的Bicomonad或类似的东西匹配吗?

  • 没有把握; 这看起来很像普通的“Monad”,仅限于元组参数(然后进行柯里化)。 (2认同)