Какими будут методы бикомонады?

Размышляя о том, какой полезный стандартный класс предложить этому

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 или 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)

наверное с законами

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

Другие вопросы по тегам