函式式程式設計的函式組合概念 原理 結合律 除錯

2021-10-24 12:12:38 字數 3371 閱讀 6901

現在我們在函式出現問題的時候處理起來就會方便很多

不過我們也可以看出,這樣一來,多出兩個中間的結果,比如說 m 和 n 但是我們在函式組合的過程中,我們不需要關注它們兩個

fn =

compose

(f1,f2,f3)

b =fn

(a)

示例

function

compose

(f, g)

}function

reverse

(array)

function

last

(array)

const post =

compose

(last, reverse)

;console.

log(

post([

1,2,

3,4]

))

const _ =

require

('lodash'

)const

reverse

= arr => arr.

reverse()

const

last

= arr => arr[0]

const

toupper

= a => a.

touppercase()

/** * reduce:對陣列中的每乙個元素,執行乙個我們自己提供的函式,並將其彙總為乙個單個的結果

* * 引數為乙個函式,函式內有兩個引數

* 第乙個:累積的結果

* 第二個:如何去處理我們每一次的結果並且返回乙個新的值 --- 他依然是個函式

* 他其實就是我們傳入的每乙個函式

* * reduce的第二個引數為第乙個引數(函式)內部變數的第乙個引數的初始值 -- 這裡其實就是acc的初始值

* */

// function compose (...args) , value)

// }

// }

const

compose=(

...args)

=> value => args.

reverse()

.reduce

((acc, fn)

=>

fn(acc)

, value)

const f =

compose

(toupper, last, reverse)

console.

log(f(

['a'

,'b'

,'c'

,'d'])

)

// 結合律(associativity)

let f =

compose

(f, g, h)

let associative =

compose

(compose

(f, g)

, h)

==compose

(f,compose

(g, h)

)// true

const _ =

require

('lodash'

)// const f = _.flowright(_.toupper, _.first, _.reverse)

// const f = _.flowright(_.flowright(_.toupper, _.first), _.reverse)

const f = _.

flowright

(_.toupper, _.

flowright

(_.first, _.reverse)

)console.

log(f(

['a'

,'b'

,'c'

,'d'])

)

const _ =

require

('lodash'

)const map = _.

curry

((fn, array)

=> _.

map(array, fn)

)const split = _.

curry

((sep,str)

=> _.

split

(str,sep)

)const join = _.

curry

((sep, array)

=> _.

join

(array, sep)

)const f = _.

flowright

(join

('-'

), _.tolower,

split

(' '))

console.

log(f(

'never say die'))

// 上述**執行結束後會有問題,但是我們不知道該在**修改,所以我們需要迭代一下我們的**

const _ =

require

('lodash'

)const

log= item =>

......

const f = _.

flowright

(join

('-'),

log(),

map(_.tolower)

,log()

,split

(' '))

console.

log(f(

'never say die'))

// 這時我們已經可以有提示了,但是還是還不能夠清楚的知道,哪條是哪條,所以還需要再次迭代

const _ =

require

('lodash'

)// const log = item =>

const trace = _.

curry

((tag, v)

=>

)...

...const f = _.

flowright

(join

('-'),

trace

('map 之後'),

map(_.tolower)

,trace

('split 之後'),

split

(' '))

console.

log(f(

'never say die'

))

函式式程式設計(四) 函式組合 函子

純函式和柯里化很容易寫出洋蔥 h g f x 就是乙個函式鑲嵌另乙個函式,多重組合,最終實現我們想要的功能,就像下面這個洋蔥一樣 函式組合,就是利用多個函式,把細粒度的函式重新組合生成乙個新的函式,從而實現我們想要的邏輯。比如 獲取陣列的最後乙個元素再轉換成大寫字母,toupper first re...

iOS函式式程式設計的實現 響應式程式設計概念

簡介 本篇主要回顧一下 ios函式式程式設計 響應式程式設計概念 如何一步步實現函式式程式設計的過程,對閱讀masonry snapkit原始碼有一定的幫助。作為乙個ios 開發者,那麼你一定用過masnory snapkit masonry是乙個oc開發中,非常好用的自動布局的第三方框架 snap...

函式式程式設計中的函式 函式式程式設計的多型

函式式程式設計中的函式 函式式程式設計的多型 儲存了計算上下文和計算過程的特殊值 儲存了計算上下文和計算過程的有輸入輸出的可計算結構。儲存了計算上下文和計算過程的可配置結構 柯里化 函式作為一種特殊的值和結構,可以由更高階的函式對其進行組合 變換 柯里化等操作 函式作為輸入和輸出 本質上都是可配置 ...