2016-11-27 2 views
11

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?

+2

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. –

Antwort

1

Dies ist keine Antwort, aber für Bimonad, wie wäre es damit?

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 

Ich weiß nicht, ob dies kategorisch Recht/interessant ist, oder auch nur entfernt nützlich, aber es riecht direkt aus einer Haskell Perspektive. Passt es zu Ihrer Bicomonad oder etwas Ähnlichem?

+2

Nicht sicher; das sieht sehr ähnlich aus wie die gewöhnliche 'Monade', die auf Tupelargumente beschränkt ist (die dann curiert werden). – leftaroundabout

+0

@leftaroundabout Einverstanden. Ich frage mich allerdings, ob/wie sich Ihr bicomonad von einem auf Tupelargumente beschränkten comonad unterscheidet. – chi

+0

@leftaroundabout, ist das nicht fast auch 'Biapplicative' (wenn man langweilige Funktoren wie' Const' ausschließt)? – dfeuer

Verwandte Themen