Applicative类型类是Functor类型类的扩展,它提供了一种更强大的抽象,可以在函数之间进行应用。
在Functor类型类中,我们只能对一个包装在上下文中的值应用一个函数。而在Applicative类型类中,我们可以将包装在上下文中的函数应用于包装在上下文中的值。
Applicative类型类的实例要求与Functor类型类的实现有关系。在实现Applicative类型类之前,我们需要先实现Functor类型类。这是因为在Applicative类型类中的一些函数,如fmap
和<$>
,依赖于Functor类型类中的fmap
函数。
下面是一个示例代码,展示了如何实现Functor和Applicative类型类:
import Control.Applicative
-- Functor类型类的实现
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap _ Nothing = Nothing
-- Applicative类型类的实现
instance Applicative Maybe where
pure = Just
(Just f) <*> (Just x) = Just (f x)
_ <*> _ = Nothing
在这个示例中,我们首先实现了Functor类型类的实例,对Maybe类型进行了映射。然后,我们实现了Applicative类型类的实例,使用pure
函数将一个值包装到上下文中,并使用<*>
操作符将一个包装在上下文中的函数应用于一个包装在上下文中的值。
通过实现Applicative类型类,我们可以在Maybe类型的上下文中应用函数,而不仅仅是对值进行映射。例如,我们可以使用Just (+1) <*> Just 2
来计算Just 3
。而在Functor类型类中,我们只能使用fmap (+1) (Just 2)
来计算Just 3
。