2017-07-23 10 views
12

Znany alternatywa sformułowanie Applicative (patrz, np Typeclassopedia) jestaplikacyjnych ustawy o alternatywnych środkach klasy

class Functor f => Monoidal f where 
    unit :: f() 
    pair :: f a -> f b -> f (a, b) 

Prowadzi to do przepisów, które wyglądają bardziej jak typowych tożsamości i skojarzeń prawami niż to, co można uzyskać z Applicative, ale tylko podczas pracy z izomorfizmami reasocjującymi parę. Myśląc o tym kilka tygodni temu, wymyśliłem dwa inne sformułowania, które pozwalają uniknąć tego problemu.

class Functor f => Fapplicative f where 
    funit :: f (a -> a) 
    fcomp :: f (b -> c) -> f (a -> b) -> f (a -> c) 

class Functor f => Capplicative f where 
    cunit :: Category (~>) => f (a ~> a) 
    ccomp :: Category (~>) => f (b ~> c) -> f (a ~> b) -> f (a ~> c) 

To łatwe do wdrożenia Capplicative użyciu Applicative, Fapplicative użyciu Capplicative i Applicative użyciu Fapplicative, więc wszystkie one mają równoważną moc.

Prawa dotyczące tożsamości i asocjacji są całkowicie oczywiste. Ale Monoidal potrzebuje prawa naturalizmu, a one również muszą. Jak mogę je sformułować? Też: Capplicative zdaje się sugerować natychmiastowe uogólnienie:

class (Category (~>), Functor f) => Appish (~>) f where 
    unit1 :: f (a ~> a) 
    comp1 :: f (b ~> c) -> f (a ~> b) -> f (a ~> c) 

jestem trochę ciekaw czy ten (lub coś podobnego) jest dobre dla czegoś.

+1

To kategoria nazywa [statyczny] (https://hackage.haskell.org/package/semigroupoids-5.2/docs/Data-Semigroupoid-Static. html). – jpath

Odpowiedz

1

To naprawdę fajny pomysł!

myślę wolna twierdzenie dla fcomp jest

fcomp (fmap (post .) u) (fmap (. pre) v) = fmap (\f -> post . f . pre) (fcomp u v) 
+0

Jeśli okaże się to wystarczające (spróbuję, gdy dostanę szansę), sugeruje to, że ograniczenie "Functor" na 'Appish' może zostać osłabione, a jednocześnie uzyskać coś" sensownego ". Zamiast "fmap", prawo to można wyrazić za pomocą 'dimap'-like' (c ~> d) -> (a ~> b) -> f (b ~> c) -> f (a ~> d) '. – dfeuer

+0

Ta dyskusja wydaje się być powiązana: https://stackoverflow.com/questions/24668313/arrows-are-exactly-equivalent-to-applicative-functors –

Powiązane problemy