2017-07-23 4 views
12

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 CapplicativeApplicative, 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.

+1

Cette catégorie est appelée [statique] (https://hackage.haskell.org/package/semigroupoids-5.2/docs/Data-Semigroupoid-Static. html). – jpath

Répondre

1

C'est une idée vraiment chouette!

Je pense que le théorème est gratuit pour fcomp

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

Si cela s'avère suffisant (je vais essayer quand j'ai une chance), cela suggère que la contrainte 'Functor' sur' Appish' pourrait être affaiblie tout en obtenant quelque chose de "sensible". Plutôt que 'fmap', cette loi pourrait être exprimée avec un' dimap'-like '(c ~> d) -> (a ~> b) -> f (b ~> c) -> f (a ~> d) '. – dfeuer

+0

Cette discussion semble liée: https://stackoverflow.com/questions/24668313/arrows-are-equivalent-to-applicative-functors –