Während sinniert, was sinnvoller Standardklasse to this oneWas wären die Methoden einer Bi-Comonade?
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
vorzuschlagen es fiel mir ein, dass anstelle von etwas VectorSpace
-y oder R2
, ein eher allgemeinere Tier könnte hier lauern: ein Type -> Type -> Type
dessen zwei enthaltenen Typen beide extrahiert werden können. Hm, vielleicht können sie extract
ed sein?
Es stellt sich heraus, weder das comonad
noch bifunctors
Paket enthält etwas namens Bicomonad
. Die Frage ist, würde eine solche Klasse sogar kategorientheoretisch Sinn machen? Im Gegensatz zu Bimonad
(die auch nicht definiert ist, und ich konnte nicht wirklich sehen, wie aussehen könnte), eine naive Definition scheint plausibel:
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)
wahrscheinlich mit den Gesetzen
fst . bidup ≡ id
snd . bidup ≡ id
bimap fst snd . bidup ≡ id
bimap bidup bidup . bidup ≡ bidup . bidup
aber finde ich es beunruhigend, dass beide Felder des Ergebnisses von bidup
den gleichen Typ enthalten, und es gibt eine ganze Reihe anderer, vielleicht "besser" vorstellbarer Signaturen.
Irgendwelche Gedanken?
Keine Antwort, aber: Eine (Co) Monade ist nur ein (Co) Monoid (mit Funktorzusammensetzung wie das Tensorprodukt) in der Kategorie ** Endo ** Funktoren, oder? Haskell Bifunctors sind keine Endofunctors. Ich bin mir also nicht sicher, wie eine echte Bi (Co) Monade aussehen würde oder ob es sinnvoll ist, so etwas auf Bifunktoren zu bauen. Aber vielleicht gibt es noch etwas Nützliches, das "irgendwie wie" einem Bikomonaden ähnelt, also ist es immer noch eine interessante Frage. –