¿Cuáles serían los métodos de una bi-comonad?
Mientras reflexiona sobre qué clase estándar más útil sugerira este
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
me ocurrió que en lugar de algoVectorSpace
-y oR2
, una bestia bastante más general podría acechar aquí: unType -> Type -> Type
cuyos dos tipos contenidos pueden ser extraídos. Hm, tal vez puedan serextract
ed?
Resulta que ni elcomonad
nibifunctors
el paquete contiene algo llamadoBicomonad
. La pregunta es, ¿tendría sentido una clase así, teóricamente por categoría? diferente aBimonad
(que tampoco está definido, y realmente no podía ver cómo podría verse), una definición ingenua parece plausible:
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)
probablemente con las leyes
fst . bidup ≡ id
snd . bidup ≡ id
bimap fst snd . bidup ≡ id
bimap bidup bidup . bidup ≡ bidup . bidup
pero me parece inquietante que ambos campos del resultado debidup
contienen el mismo tipo, y hay muchas otras firmas concebibles, quizás "mejores".
¿Alguna idea?