Une autre formulation bien connue de Applicative
(voir, par exemple, Typeclassopedia) estlois Applicative pour des formulations de classe alternatives
class Functor f => Monoidal f where
unit :: f()
pair :: f a -> f b -> f (a, b)
Cela conduit à des lois qui ressemblent plus à des lois d'identité typiques et associativité que ce que vous obtenez de Applicative
, mais uniquement lorsque vous travaillez sur des isomorphismes de réassociation de paires. En pensant à cela il y a quelques semaines, j'ai trouvé deux autres formulations qui évitent ce problème.
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)
Il est facile à mettre en œuvre à l'aide Capplicative
Applicative
, Fapplicative
en utilisant Capplicative
et Applicative
en utilisant Fapplicative
, de sorte que ces tous ont une puissance équivalente.
Les lois d'identité et d'associativité sont entièrement évidentes. Mais Monoidal
a besoin d'une loi de naturalité, et ceux-ci doivent aussi bien. Comment pourrais-je les formuler? Aussi: Capplicative
semble suggérer une généralisation immédiate:
class (Category (~>), Functor f) => Appish (~>) f where
unit1 :: f (a ~> a)
comp1 :: f (b ~> c) -> f (a ~> b) -> f (a ~> c)
Je suis un peu curieux de savoir si ce (ou quelque chose de similaire) est bon pour quelque chose.
Cette catégorie est appelée [statique] (https://hackage.haskell.org/package/semigroupoids-5.2/docs/Data-Semigroupoid-Static. html). – jpath