Monoidal Functor es aplicativo, pero ¿dónde está la clase de monoide en la definición de aplicativo?
Applicative es un Fundador monoidal:
mappend :: f -> f -> f
$ :: (a -> b) -> a -> b
<*> :: f(a -> b) -> f a -> f b
Pero no veo ninguna referencia sobre Monoid en la definición de la clase de tipo Aplicativo, ¿podría decirme por qué?
Definición
class Functor f => Applicative (f :: * -> *) where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
GHC.Base.liftA2 :: (a -> b -> c) -> f a -> f b -> f c
(*>) :: f a -> f b -> f b
(<*) :: f a -> f b -> f a
{-# MINIMAL pure, ((<*>) | liftA2) #-}
No se menciona esa monoide estructural en esta definición, pero cuando lo hace
> ("ab",(+1)) <*> ("cd", 5)
>("abcd", 6)
Puede ver claramente el uso de un monoide estructural "(,) Cadena" al implementar esta instancia de aplicativo.
Otro ejemplo para mostrar que se utiliza un "Monoide estructural":
Prelude Data.Monoid> (2::Integer,(+1)) <*> (1::Integer,5)
<interactive>:35:1: error:
• Could not deduce (Monoid Integer) arising from a use of ‘<*>’
from the context: Num b
bound by the inferred type of it :: Num b => (Integer, b)
at <interactive>:35:1-36
• In the expression: (2 :: Integer, (+ 1)) <*> (1 :: Integer, 5)
In an equation for ‘it’:
it = (2 :: Integer, (+ 1)) <*> (1 :: Integer, 5)