A Haskell's Functor
allows one to map any type a
(an object of Hask) to a type F a
and also map a function a -> b
(a morphism of Hask) to a function with type F a -> F b
. This corresponds to a Category Theory definition in a sense that functor preserves basic category structure.
A monoidal category is a category that has some additional structure:
Taking a pair as our product, this definition can be translated to Haskell in the following way:
class Functor f => Monoidal f where
mcat :: f a -> f b -> f (a,b)
munit :: f ()
The Applicative
class is equivalent to this Monoidal
one and thus can be implemented in terms of it:
instance Monoidal f => Applicative f where
pure x = fmap (const x) munit
f <*> fa = (\(f, a) -> f a) <$> (mcat f fa)