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