Skip to content
Go back

applicative

Updated:

applicative

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

AstroPaper v3

Applicative 是 Haskell 中的一个重要概念,构建在 Functor 的基础上,提供了一种处理多个上下文中的值的方法。它允许你将函数应用于包含在 Applicative 容器中的值,同时保留结构。下面是对 Applicative 的详细介绍。

Applicative 的定义

Applicative 是一个类型类,定义了两个主要的操作:

  1. pure:将一个值放入一个 Applicative 上下文中。
  2. (<*>):将一个包含函数的 Applicative 应用到另一个 Applicative 中的值。

在 Haskell 中,Applicative 的类型类定义如下:

class Functor f => Applicative f where
    pure :: a -> f a
    (<*>) :: f (a -> b) -> f a -> f b

直观理解

Applicative 可以看作是对 Functor 的扩展,允许你将函数应用于多个上下文的值。Applicative 使得组合和应用多个 Functor 更加灵活。

示例

  1. Maybe

    Maybe 上,pure 将一个值放入 Just 中,而 (<*>) 允许你将 Just 中的函数应用到另一个 Maybe 值上:

    pure 5 :: Maybe Int
    -- Just 5
    
    Just (+2) <*> Just 3
    -- Just 5
    
    Just (+2) <*> Nothing
    -- Nothing
    
  2. 列表

    对于列表,pure 会返回一个单元素列表,而 (<*>) 会生成所有可能的组合:

    pure 5 :: [Int]
    -- [5]
    
    [(+1), (*2)] <*> [1, 2, 3]
    -- [2, 3, 4, 2, 4, 6]
    
  3. 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 定律

Applicative 也需要遵循一些定律,以保证操作的一致性:

  1. 同一性定律(Identity Law):

    pure id <*> v = v
  2. 组合性定律(Composition Law):

    pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
    
  3. 升级定律(Homomorphism):

    pure f <*> pure x = pure (f x)
    
  4. 交互性定律(Interchange):

    u <*> pure y = pure ($ y) <*> u
    

为什么 Applicative 重要?

总结

通过理解 Applicative,你可以更好地处理复杂的数据结构和上下文,提高代码的可组合性和灵活性。


Suggest Changes

Previous Post
bind fmap join
Next Post
半群和幺半群