現在我們在函式出現問題的時候處理起來就會方便很多
不過我們也可以看出,這樣一來,多出兩個中間的結果,比如說 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...
函式式程式設計中的函式 函式式程式設計的多型
函式式程式設計中的函式 函式式程式設計的多型 儲存了計算上下文和計算過程的特殊值 儲存了計算上下文和計算過程的有輸入輸出的可計算結構。儲存了計算上下文和計算過程的可配置結構 柯里化 函式作為一種特殊的值和結構,可以由更高階的函式對其進行組合 變換 柯里化等操作 函式作為輸入和輸出 本質上都是可配置 ...