Functors, Applicatives, And Monads In Pictures學(xué)習(xí)筆記

前言

最近一直在忙一些公司的項(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ò)誤的地方麻煩留言并指出,謝謝.

原文地址,以下圖片均出自這篇文章.

雷純鋒的看法

Noah前輩的文章,主要講的是swift如何去描述

函數(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è)上下文中的值。

未完待續(xù) 后面我還會(huì)再仔細(xì)的看一些相關(guān)的資料,畢竟Monad這里確實(shí)不好理解,如果有什么新的變動(dòng)我會(huì)及時(shí)的記下來(lái)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容