Haskell 对functor和applicative的理解

盒子里的计算

如果我们要运算1+2的话我们直接写:1+2,这样就会返回结果3.

但是,如果我们要计算列表里面的数值怎么办呢?

例如:
我们想计算 [1] + [2],我们希望haskell能计算出的结果是[3],这时候<*>与<$>的作用就出来了,通过下面的表达式我们可以得到结果[3]

(+) <$> [1] <*> [2]

<$>会把(+)运算符变成列表内部的运算符,可以当作是一个柯里化后的函数(+) 1放入了列表变为[ (+ 1)]

<*>就会运算列表内的计算,计算出[(+1)] 与[2]的值


1、对<$>与<*>的理解

  • 函数组合
    (.) :: (b -> c) -> (a -> b) -> a -> c

  • 0优先级的函数应用
    ($) :: (a -> b) > a -> b

  • 帮助把函数应用到函子里的数据上
    (<$>) :: (a -> b) -> f a -> f b

  • 把函子里的函数应用到函子里的数据上
    (<*>) :: f (a -> b) -> f a -> f b


2、对(>>=)的理解

(>>=) :: m a -> (a -> m a) -> m b

(>>=)运算符相当于把基于applicative类型类的monad类型类m a 中的各个元素a需出来,每个元素a运用一次(a -> m b)的函数得到一系列的m b,再通过二元运算符<*>,将各个m b接连成一个新的m b

例如:

> [1,2,3,4,5] >>= \x -> [x+1]
[2,3,4,5,6]

这里相当于将列表[1,2,3,4,5]中的各个元素1,2,3,4,5分别取出来,应用到函数(\x -> [x+1])上,分别得到[2],[3],[4],[5],[6],再通过列表的二元运算符(<*> = (++)),连接各个结果,得到最终的列表[2,3,4,5,6]


3、(-> r)的Monad实例

instance Monad (-> r) where
	(>>=) :: (r -> a) -> (a -> r -> b) -> r -> b
	f >>= g = \r -> g (f r) r

例如:

> (+1) >>= (*) >>= (-) $ 3
9

计算过程为: (相当于(3+1)*3-3)

	(+1) >>= (*) >>= (-) $ 3
= (\r -> (*) ((+1) r) r) >>= (-) $ 3
= (\r -> (-) ((\r -> (*) ((+1) r) r) >>= (-)) r)r)  $ 3
= (-) ((*) ((+1) 3) 3) 3
= (-) ((*) 4 3) 3
= (-) 12 3
= 9
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值