Каковы были бы методы би-комонады?

Во время размышления над тем, какой более полезный стандартный класс предлагает для этого

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 -y или R2, здесь может скрываться более общий зверь: a Type -> Type -> Type, два из которых могут быть извлечены. Hm, возможно, они могут быть extract ed?

Выключает ни 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)

вероятно, с законами

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

но я нахожу его тревожным, что оба поля результата bidup содержат один и тот же тип, и существует множество других, возможно, "лучших" мыслимых сигнатур.

Любые мысли?

Ответ 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 или что-то подобное?