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