问题描述
Applicative是Monoidal函子:
Applicative is a Monoidal Functor :
mappend :: f -> f -> f
$ :: (a -> b) -> a -> b
<*> :: f(a -> b) -> f a -> f b
但是在Applicative类型类的定义中我没有看到任何有关Monoid的参考,您能告诉我为什么吗?
But I don't see any reference about Monoid in the definition of the Applicative typeclass, could you tell me why ?
定义:
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) #-}
此定义中未提及该结构Monoid,但在您这样做时
No mention of that structural Monoid is provided in this definition, but when you do
> ("ab",(+1)) <*> ("cd", 5)
>("abcd", 6)
在实现此Applicative实例时,您可以清楚地看到结构Monoid(,)String"的使用.
You can clearly see the use of a Structural Monoid "(,) String" when implementing this instance of Applicative.
另一个显示使用结构Monoid"的示例:
Another example to show that a "Structural Monoid" is used :
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)
推荐答案
被称为"monoidal functor"的monoid不是Monoid
monoid,即值级monoid.相反,它是一个 type-level monoid .即无聊的产品monoid
The monoid that's referred to with "monoidal functor" is not a Monoid
monoid, i.e. a value-level monoid. It's a type-level monoid instead. Namely, the boring product monoid
type Mempty = ()
type a <> b = (a,b)
(您可能会注意到,这并不是严格意义上的等分体;只有将((a,b),c)
和(a,(b,c))
视为同一类型时,它们才是同构的.)
(You may notice that this is not strictly speaking a monoid; it's only if you consider ((a,b),c)
and (a,(b,c))
as the same type. They are sure enough isomorphic.)
要查看与Applicative
的关系,请分别.单项仿函数,我们需要用其他术语来编写类.
To see what this has to do with Applicative
, resp. monoidal functors, we need to write the class in other terms.
class Functor f => Monoidal f where
pureUnit :: f Mempty
fzip :: f a -> f b -> f (a<>b)
-- an even more "general nonsense", equivalent formulation is
-- upure :: Mempty -> f Mempty
-- fzipt :: (f a<>f b) -> f (a<>b)
-- i.e. the functor maps a monoid to a monoid (in this case the same monoid).
-- That's really the mathematical idea behind this all.
IOW
class Functor f => Monoidal f where
pureUnit :: f ()
fzip :: f a -> f b -> f (a,b)
根据Monoidal
定义标准Applicative
类的通用实例是一个简单的练习,反之亦然.
It's a simple exercise to define a generic instance of the standard Applicative
class in terms of Monoidal
, vice versa.
关于("ab",(+1)) <*> ("cd", 5)
:通常,这与Applicative
并没有多大关系,而仅与专门适用于作者的作者有关.实例是
Regarding ("ab",(+1)) <*> ("cd", 5)
: that doesn't have much to do with Applicative
in general, but only with the writer applicative specifically. The instance is
instance Monoid a => Monoidal ((,) a) where
pureUnit = (mempty, ())
fzip (p,a) (q,b) = (p<>q, (a,b))
这篇关于Monoidal函子是Applicative的,但是Monoid类型类在Applicative的定义中在哪里?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!