Каковы были бы методы би-комонады?
Во время размышления над тем, какой более полезный стандартный класс предлагает для этого
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
, здесь может скрываться более общий зверь: a Type -> Type -> Type
, два из которых могут быть извлечены. Hm, возможно, они могут быть extract
ed?
Выключает ни 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
или что-то подобное?