applicative
Applicative 类型类允许使用上下文内的函数,例如 Maybe 或 IO,这扩展了 Functor 类型类的功能。由于 Applicative 与 Functor 的工作方式,Functor 是 Applicative 的超类。

Applicative 是 Haskell 中的一个重要概念,构建在 Functor 的基础上,提供了一种处理多个上下文中的值的方法。它允许你将函数应用于包含在 Applicative 容器中的值,同时保留结构。下面是对 Applicative 的详细介绍。
Applicative 的定义
Applicative 是一个类型类,定义了两个主要的操作:
- pure:将一个值放入一个
Applicative上下文中。 - (<*>):将一个包含函数的
Applicative应用到另一个Applicative中的值。
在 Haskell 中,Applicative 的类型类定义如下:
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
f是一个Applicative容器(如列表、Maybe等)。pure将一个值放入Applicative上下文。(<*>)将一个函数应用于另一个Applicative中的值。
直观理解
Applicative 可以看作是对 Functor 的扩展,允许你将函数应用于多个上下文的值。Applicative 使得组合和应用多个 Functor 更加灵活。
示例
-
Maybe
在
Maybe上,pure将一个值放入Just中,而(<*>)允许你将Just中的函数应用到另一个Maybe值上:pure 5 :: Maybe Int -- Just 5 Just (+2) <*> Just 3 -- Just 5 Just (+2) <*> Nothing -- Nothing -
列表
对于列表,
pure会返回一个单元素列表,而(<*>)会生成所有可能的组合:pure 5 :: [Int] -- [5] [(+1), (*2)] <*> [1, 2, 3] -- [2, 3, 4, 2, 4, 6] -
Either
在
Either上,pure将值放入Right中,而(<*>)只在没有错误的情况下应用函数:pure 5 :: Either String Int -- Right 5 Right (+2) <*> Right 3 -- Right 5 Right (+2) <*> Left "Error" -- Left "Error"
Applicative 的应用
- 组合多个上下文:使用
Applicative,你可以方便地在多个上下文中应用函数,适用于需要组合多个值的场景。 - 有效的错误处理:在使用
Maybe或Either时,Applicative使得错误处理变得更加简洁。
Applicative 定律
Applicative 也需要遵循一些定律,以保证操作的一致性:
-
同一性定律(Identity Law):
pure id <*> v = v -
组合性定律(Composition Law):
pure (.) <*> u <*> v <*> w = u <*> (v <*> w) -
升级定律(Homomorphism):
pure f <*> pure x = pure (f x) -
交互性定律(Interchange):
u <*> pure y = pure ($ y) <*> u
为什么 Applicative 重要?
- 更高的灵活性:
Applicative允许你在多个上下文中组合值,比单纯的Functor更加灵活。 - 基础构建块:
Applicative是构建更复杂抽象(如Monad)的基础,理解它可以帮助你更深入地学习 Haskell。
总结
Applicative是对Functor的扩展,允许在多个上下文中应用函数。pure和(<*>)是核心操作,分别用于将值放入上下文和将函数应用于上下文中的值。- 遵循定律,确保操作的一致性和可预测性。
通过理解 Applicative,你可以更好地处理复杂的数据结构和上下文,提高代码的可组合性和灵活性。