Haskell 与 Applicative Functor

Aplicative 函子(Control.Applicative)

应用型函子地定义了一组函子上的操作,对函子 F: A -> B:
    应用型函子能将A范畴上的态射 f 映射到范畴 B 上,即 f -> F(f)

由此我们可以像操作普通态射 f 一样操作映射后的态射 F(f)

class Functor f => Applicative f where
    -- 将 a 映射到另一个范畴(提升, lift)
    pure :: a -> f a
    -- 转换态射
    (<*>) :: f(a -> b) -> f a -> f b

-- 对于 []:
instance Applicative [] where
    pure x = [x]
    fs <*> <xs> = [f x | f <- fs, x <- xs]

-- 对于 (->) r:
instance Applicative ((->) r) where
    pure f = \_ -> f
    f <*> g = \x -> f x $ g x


-- 另外还有几个预定义的操作符:
(<$>) :: Functor f => (a -> b) -> f a -> f b
(<$>) = fmap
-- 所以对于 Functor ((->) r):(<$>) = fmap = (.)

liftA  :: Applicative f => (a -> b) -> f a -> f b
liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c
liftA3 :: Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d

范例:

    (+) <$> (+3) <*> (*100) $ 5
= (\x y -> x + y) <$> (\x -> x + 3) <*> (\x -> x * 100) $ 5
= (\x y -> (x + 3) + y) <*> (\x -> x * 100) $ 5
= (\x -> (x + 3) + (x * 100)) $ 5
= (5 + 3) + (5 * 100)
= 508

    (\x y z -> [x, y, z]) <$> (+3) <$> (*2) <*> (/2) $ 5
= (\x -> (\y -> (\z -> [x, y, z]))) <$> (+3) <*> (*2) <*> (/2) $ 5
= (\x -> (\y -> (\z -> [(x + 3), y, z]))) <*> (*2) <*> (/2) $ 5
= (\x -> (\z -> [(x + 3), (x * 2), z])) <*> (/2) $ 5
= (\x -> [(x + 3), (x * 2), (x / 2)]) $ 5
= [(5 + 3), (5 * 2), (5 / 2)]
= [8.0, 10.0, 2.5]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值