Какими будут методы бикомонады?
Размышляя о том, какой полезный стандартный класс предложить этому
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
или что-то подобное?