Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Applicative laws for alternative class formulations

A well-known alternative formulation of Applicative (see, e.g., Typeclassopedia) is

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

This leads to laws that look more like typical identity and associativity laws than what you get from Applicative, but only when you work through pair-reassociating isomorphisms. Thinking about this a few weeks ago, I came up with two other formulations that avoid this problem.

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)

It's easy to implement Capplicative using Applicative, Fapplicative using Capplicative, and Applicative using Fapplicative, so these all have equivalent power.

The identity and associativity laws are entirely obvious. But Monoidal needs a naturality law, and these must as well. How might I formulate them? Also: Capplicative seems to suggest an immediate generalization:

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

I am a bit curious about whether this (or something similar) is good for something.

like image 608
dfeuer Avatar asked Jul 23 '17 17:07

dfeuer


People also ask

Is a Monad applicative?

An applicative is a data type that implements the Applicative typeclass. A monad is a data type that implements the Monad typeclass. A Maybe implements all three, so it is a functor, an applicative, and a monad.

What is applicative Haskell?

In Haskell, an applicative is a parametrized type that we think of as being a container for data of that type plus two methods pure and <*> . Consider a parametrized type f a . The pure method for an applicative of type f has type. pure :: a -> f a. and can be thought of as bringing values into the applicative.

What is applicative in Scala?

Applicative is a generalization of Monad , allowing expression of effectful computations in a pure functional way. Applicative is generally preferred to Monad when the structure of a computation is fixed a priori.

What are Functors Haskell?

Functor in Haskell is a kind of functional representation of different Types which can be mapped over. It is a high level concept of implementing polymorphism. According to Haskell developers, all the Types such as List, Map, Tree, etc. are the instance of the Haskell Functor.


1 Answers

This is a really neat idea!

I think the free theorem for fcomp is

fcomp (fmap (post .) u) (fmap (. pre) v) = fmap (\f -> post . f . pre) (fcomp u v)
like image 179
Sjoerd Visscher Avatar answered Nov 10 '22 19:11

Sjoerd Visscher