Functors, Applicatives, And Monads In Pictures学习笔记

前言

最近一直在忙一些公司的项目,所以时间比较少吧,还好最近的事情和BUG已经改的差不多了,又可以回到学习RAC和音视频的路上来了,内心还是非常高兴地.以前Noah前辈说想看懂RAC源码就首先去了解下Functors, Applicatives,Monads,看到网上对这些概念的讲解有时还是比较模糊的,恰巧看到一篇文章才大概明白是怎么一个回事,如果笔记有错误的地方麻烦留言并指出,谢谢.

原文地址,以下图片均出自这篇文章.

雷纯锋的看法

Noah前辈的文章,主要讲的是swift如何去描述

函数式的理解

Functors, Applicatives, And Monads In Pictures学习笔记_第1张图片

我个人的理解就是输出全凭输入的参数决定,中间不会有别的东西影响,例如在OC中的全局属性影响,有可能在OC中的一些全局属性你要根据他去判断,此时这个全局属性也决定了方法的输出,所以此时就不能称之其为函数式了.上图是一个最简单的例子,2这个值通过加3这个函数最后就得到了5,这个值是不会受别的因素影响的.

Maybe类型

Functors, Applicatives, And Monads In Pictures学习笔记_第2张图片

Maybe他就类似swift中的可选值吧,它里面有可能是有值得也有可能是为空的,如果能够成功获取就取出其值否则把它为空处理.

Functors

Functors, Applicatives, And Monads In Pictures学习笔记_第3张图片

当值被包裹在context里时我们是无法直接对这个值进行函数运算的,此时我们就需要用到Functors.

Functors, Applicatives, And Monads In Pictures学习笔记_第4张图片

fmap知道如何应用功能于被包裹在一个上下文值。例如,假设你想申请(+3)到Just 2。使用fmap:
> fmap (+3) (Just 2)
Just 5

那么fmap究竟是怎样工作的呢?

Functors, Applicatives, And Monads In Pictures学习笔记_第5张图片

首先将Just2中的值取出,对值直接进行函数运算,运算完成后对输出值再次进行包裹.

Functors, Applicatives, And Monads In Pictures学习笔记_第6张图片

空值的话因为其值为空,所以此时直接输出一个空的context.

Functor 就是任何能用 fmap操作的数据类型.使用 fmap应用一个函数到一个上下文中的值.

Applicatives

Functors, Applicatives, And Monads In Pictures学习笔记_第7张图片

像这种时候函数也封装在上下文里时我们是无法直接用fmap来对其进行操作的,此时我们需要用到<*>这个函数,这个函数长得蛮奇怪的读作apply,这个函数知道怎样把封装在上下文里的函数应用到封装在上下文里的值.如上图所示从上下文中取出,经过函数处理过后将输出的值放入一个新的上下文中.

Applicatives是增强型的 Functor一种数据类型要成为 Applicative的前提条件是它必须是 Functor.使用 <>应用一个上下文中的函数到一个上下文中的值.*

Monad

关于Monad网上的见解也是众说纷纭,今天在群里听臧老师讲解也是收获不少蛮佩服的吧.

Functors, Applicatives, And Monads In Pictures学习笔记_第8张图片

这幅图刚开始看的时候我是迷茫的,因为我刚开始的感觉就是Applicatives和Monad没有区别,后来仔细看才发现这里的封装过的函数其实是有返回值的,这个函数又会返回一个上下文的值。

Monad中有两个需要注意的函数,一个是return另一个则是>>=(读作Bind),return相当于直接将值放入上下文中,而 >>=函数的功能则是应用一个(接收一个普通值 a但是返回一个在上下文中的值 m b的)函数 (a -> m b) 到一个上下文中的值 m a,并返回另一个在相同上下文中的值 m b 。

Functors, Applicatives, And Monads In Pictures学习笔记_第9张图片

这里可以看到Monad另一个很大的特点,链式操作,将JUST 20通过Half函数得到y,再将Half函数应用到y,最后得到Nothing的过程。

Monad就是使用 >>=应用一个接收一个普通值但是返回一个在上下文中的值的函数到一个上下文中的值。

未完待续 后面我还会再仔细的看一些相关的资料,毕竟Monad这里确实不好理解,如果有什么新的变动我会及时的记下来。

你可能感兴趣的:(Functors, Applicatives, And Monads In Pictures学习笔记)