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

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

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, здесь может скрываться более общий зверь: 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 содержат один и тот же тип, и есть целый ряд других, возможно, «лучших» мыслимых сигнатур.

Какие-нибудь мысли?


person leftaroundabout    schedule 27.11.2016    source источник
comment
Не ответ, а: (ко)монада - это просто (ко)моноид (с функторной композицией в качестве тензорного произведения) в категории эндофункторов, верно? Бифункторы Haskell не являются эндофункторами. Так что я не уверен, как будет выглядеть настоящая би(ко)монада, и даже есть ли смысл строить такую ​​штуку поверх бифункторов. Но, возможно, есть еще что-то полезное, похожее на бикомонаду, так что это все еще интересный вопрос.   -  person Benjamin Hodgson♦    schedule 28.11.2016
comment
Тоже не ответ, но я пришел с математической стороны. Для нас бимонада — это комоноидальная монада, т. е. это монада на моноидальной категории, категория модулей которой снова является моноидальной категорией. (Напомним, что модули над алгеброй образуют моноидальную категорию тогда и только тогда, когда алгебра является биалгеброй). Точно так же бикомонада является моноидальной комонадой.   -  person Jo Mo    schedule 29.10.2019
comment
@JoBe очень интересно! Не могли бы вы уточнить это как ответ в математической записи?   -  person leftaroundabout    schedule 29.10.2019


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

person dfeuer    schedule 28.11.2016
comment
Не уверена; это очень похоже на обычный Monad, ограниченный аргументами кортежа (которые затем каррируются). - person leftaroundabout; 28.11.2016
comment
@leftaroundabout Согласен. Однако мне интересно, отличается ли/чем ваша бикомонада от комонады, ограниченной аргументами кортежа. - person chi; 28.11.2016
comment
@leftaroundabout, разве это не относится и к Biapplicative (если исключить скучные функторы, такие как Const)? - person dfeuer; 28.11.2016
comment
@dfeuer, я считаю Const одним из наиболее важных аппликантов, если вы занимаетесь их составлением, в чем аппликативы хороши. Просто говорю... - person luqui; 28.11.2016