¿Cuáles serían los métodos de una bi-comonad?

Mientras reflexiona sobre qué clase estándar más útil sugerira este

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

me ocurrió que en lugar de algoVectorSpace-y oR2, una bestia bastante más general podría acechar aquí: unType -> Type -> Type cuyos dos tipos contenidos pueden ser extraídos. Hm, tal vez puedan serextracted?

Resulta que ni elcomonad nibifunctors el paquete contiene algo llamadoBicomonad. La pregunta es, ¿tendría sentido una clase así, teóricamente por categoría? diferente aBimonad (que tampoco está definido, y realmente no podía ver cómo podría verse), una definición ingenua parece plausible:

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)

probablemente con las leyes

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

pero me parece inquietante que ambos campos del resultado debidup contienen el mismo tipo, y hay muchas otras firmas concebibles, quizás "mejores".

¿Alguna idea?

Respuestas a la pregunta(1)

Su respuesta a la pregunta