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ś.
To kategoria nazywa [statyczny] (https://hackage.haskell.org/package/semigroupoids-5.2/docs/Data-Semigroupoid-Static. html). – jpath