前言
最近一直在忙一些公司的项目,所以时间比较少吧,还好最近的事情和BUG已经改的差不多了,又可以回到学习RAC和音视频的路上来了,内心还是非常高兴地.以前Noah前辈说想看懂RAC源码就首先去了解下Functors, Applicatives,Monads,看到网上对这些概念的讲解有时还是比较模糊的,恰巧看到一篇文章才大概明白是怎么一个回事,如果笔记有错误的地方麻烦留言并指出,谢谢.
原文地址,以下图片均出自这篇文章.
函数式的理解
我个人的理解就是输出全凭输入的参数决定,中间不会有别的东西影响,例如在OC中的全局属性影响,有可能在OC中的一些全局属性你要根据他去判断,此时这个全局属性也决定了方法的输出,所以此时就不能称之其为函数式了.上图是一个最简单的例子,2这个值通过加3这个函数最后就得到了5,这个值是不会受别的因素影响的.
Maybe类型
Maybe他就类似swift中的可选值吧,它里面有可能是有值得也有可能是为空的,如果能够成功获取就取出其值否则把它为空处理.
Functors
当值被包裹在context里时我们是无法直接对这个值进行函数运算的,此时我们就需要用到Functors.
fmap知道如何应用功能于被包裹在一个上下文值。例如,假设你想申请(+3)到Just 2。使用fmap:
> fmap (+3) (Just 2)
Just 5
那么fmap究竟是怎样工作的呢?
首先将Just2中的值取出,对值直接进行函数运算,运算完成后对输出值再次进行包裹.
空值的话因为其值为空,所以此时直接输出一个空的context.
Functor 就是任何能用 fmap操作的数据类型.使用 fmap应用一个函数到一个上下文中的值.
Applicatives
像这种时候函数也封装在上下文里时我们是无法直接用fmap来对其进行操作的,此时我们需要用到<*>这个函数,这个函数长得蛮奇怪的读作apply,这个函数知道怎样把封装在上下文里的函数应用到封装在上下文里的值.如上图所示从上下文中取出,经过函数处理过后将输出的值放入一个新的上下文中.
Applicatives是增强型的 Functor一种数据类型要成为 Applicative的前提条件是它必须是 Functor.使用 <>应用一个上下文中的函数到一个上下文中的值.*
Monad
关于Monad网上的见解也是众说纷纭,今天在群里听臧老师讲解也是收获不少蛮佩服的吧.
这幅图刚开始看的时候我是迷茫的,因为我刚开始的感觉就是Applicatives和Monad没有区别,后来仔细看才发现这里的封装过的函数其实是有返回值的,这个函数又会返回一个上下文的值。
Monad中有两个需要注意的函数,一个是return另一个则是>>=(读作Bind),return相当于直接将值放入上下文中,而 >>=函数的功能则是应用一个(接收一个普通值 a但是返回一个在上下文中的值 m b的)函数 (a -> m b) 到一个上下文中的值 m a,并返回另一个在相同上下文中的值 m b 。
这里可以看到Monad另一个很大的特点,链式操作,将JUST 20通过Half函数得到y,再将Half函数应用到y,最后得到Nothing的过程。
Monad就是使用 >>=应用一个接收一个普通值但是返回一个在上下文中的值的函数到一个上下文中的值。