前言
最近一直在忙一些公司的項(xiàng)目,所以時(shí)間比較少吧,還好最近的事情和BUG已經(jīng)改的差不多了,又可以回到學(xué)習(xí)RAC和音視頻的路上來(lái)了,內(nèi)心還是非常高興地.以前Noah前輩說(shuō)想看懂RAC源碼就首先去了解下Functors, Applicatives,Monads,看到網(wǎng)上對(duì)這些概念的講解有時(shí)還是比較模糊的,恰巧看到一篇文章才大概明白是怎么一個(gè)回事,如果筆記有錯(cuò)誤的地方麻煩留言并指出,謝謝.
原文地址,以下圖片均出自這篇文章.
函數(shù)式的理解

我個(gè)人的理解就是輸出全憑輸入的參數(shù)決定,中間不會(huì)有別的東西影響,例如在OC中的全局屬性影響,有可能在OC中的一些全局屬性你要根據(jù)他去判斷,此時(shí)這個(gè)全局屬性也決定了方法的輸出,所以此時(shí)就不能稱之其為函數(shù)式了.上圖是一個(gè)最簡(jiǎn)單的例子,2這個(gè)值通過(guò)加3這個(gè)函數(shù)最后就得到了5,這個(gè)值是不會(huì)受別的因素影響的.
Maybe類型

Maybe他就類似swift中的可選值吧,它里面有可能是有值得也有可能是為空的,如果能夠成功獲取就取出其值否則把它為空處理.
Functors

當(dāng)值被包裹在context里時(shí)我們是無(wú)法直接對(duì)這個(gè)值進(jìn)行函數(shù)運(yùn)算的,此時(shí)我們就需要用到Functors.

fmap知道如何應(yīng)用功能于被包裹在一個(gè)上下文值。例如,假設(shè)你想申請(qǐng)(+3)到Just 2。使用fmap:
> fmap (+3) (Just 2)
Just 5
那么fmap究竟是怎樣工作的呢?

首先將Just2中的值取出,對(duì)值直接進(jìn)行函數(shù)運(yùn)算,運(yùn)算完成后對(duì)輸出值再次進(jìn)行包裹.

空值的話因?yàn)槠渲禐榭?所以此時(shí)直接輸出一個(gè)空的context.
Functor 就是任何能用 fmap操作的數(shù)據(jù)類型.使用 fmap應(yīng)用一個(gè)函數(shù)到一個(gè)上下文中的值.
Applicatives

像這種時(shí)候函數(shù)也封裝在上下文里時(shí)我們是無(wú)法直接用fmap來(lái)對(duì)其進(jìn)行操作的,此時(shí)我們需要用到<*>這個(gè)函數(shù),這個(gè)函數(shù)長(zhǎng)得蠻奇怪的讀作apply,這個(gè)函數(shù)知道怎樣把封裝在上下文里的函數(shù)應(yīng)用到封裝在上下文里的值.如上圖所示從上下文中取出,經(jīng)過(guò)函數(shù)處理過(guò)后將輸出的值放入一個(gè)新的上下文中.
Applicatives是增強(qiáng)型的 Functor一種數(shù)據(jù)類型要成為 Applicative的前提條件是它必須是 Functor.使用 <>應(yīng)用一個(gè)上下文中的函數(shù)到一個(gè)上下文中的值.*
Monad
關(guān)于Monad網(wǎng)上的見(jiàn)解也是眾說(shuō)紛紜,今天在群里聽(tīng)臧老師講解也是收獲不少蠻佩服的吧.
這幅圖剛開(kāi)始看的時(shí)候我是迷茫的,因?yàn)槲覄傞_(kāi)始的感覺(jué)就是Applicatives和Monad沒(méi)有區(qū)別,后來(lái)仔細(xì)看才發(fā)現(xiàn)這里的封裝過(guò)的函數(shù)其實(shí)是有返回值的,這個(gè)函數(shù)又會(huì)返回一個(gè)上下文的值。
Monad中有兩個(gè)需要注意的函數(shù),一個(gè)是return另一個(gè)則是>>=(讀作Bind),return相當(dāng)于直接將值放入上下文中,而 >>=函數(shù)的功能則是應(yīng)用一個(gè)(接收一個(gè)普通值 a但是返回一個(gè)在上下文中的值 m b的)函數(shù) (a -> m b) 到一個(gè)上下文中的值 m a,并返回另一個(gè)在相同上下文中的值 m b 。
這里可以看到Monad另一個(gè)很大的特點(diǎn),鏈?zhǔn)讲僮?,將JUST 20通過(guò)Half函數(shù)得到y(tǒng),再將Half函數(shù)應(yīng)用到y(tǒng),最后得到Nothing的過(guò)程。
Monad就是使用 >>=應(yīng)用一個(gè)接收一個(gè)普通值但是返回一個(gè)在上下文中的值的函數(shù)到一個(gè)上下文中的值。