一、判斷題:
(1)函數(shù)式編程是面向?qū)ο缶幊痰纳?jí)產(chǎn)品
錯(cuò)。這是兩種完全不同的編程范式凶赁,沒有直接聯(lián)系观蜗。
(2)組成鏈?zhǔn)秸{(diào)用的必要條件就是在方法里面返回對(duì)象自己
錯(cuò)臊恋,只要返回的是同一個(gè)類型的對(duì)象就可以,未必要是自己墓捻。
(3)ReactiveCocoa是Facebook出的一個(gè)FRP開源庫
錯(cuò)抖仅。不是fb公司的項(xiàng)目,來自github團(tuán)隊(duì)。
(4)ReactiveCocoa是基于KVO的一個(gè)開源庫
錯(cuò)撤卢。雖然有些信號(hào)的產(chǎn)生來自kvo环凿,但是有些不是。
(5)ReactiveCocoa是一個(gè)純函數(shù)式編程的庫
錯(cuò)放吩。rac不全是函數(shù)式編程智听,它更多的設(shè)計(jì)目標(biāo)是響應(yīng)式編程。
(5)下面的函數(shù)由于有賦值所以不是一個(gè)純函數(shù)
雖然有賦值渡紫,但是每次固定輸入都能得到固定的輸出到推,并且沒有改變外部的狀態(tài),是純函數(shù)惕澎。
二莉测、問答題:
(1)Pull-driver和Push-driver的區(qū)別?
想到了master集灌,slave這個(gè)經(jīng)典的場景悔雹。一個(gè)黑心的老板有5個(gè)程序員,這里有100個(gè)需求欣喧。每個(gè)程序員完成后腌零,告訴老板說我做完了,再來一個(gè)需求唆阿。這就是pull driver益涧,接收方主動(dòng)來拿。如果老板不管這個(gè)人忙不忙驯鳖,需求來了就直接分配給某個(gè)程序員闲询,這就是push driver,源直接推送給某個(gè)接收方浅辙。
(2)怎么理解函數(shù)式語言中的引用透明扭弧?
阮一峰的博客:
引用透明(Referential transparency),指的是函數(shù)的運(yùn)行不依賴于外部變量或"狀態(tài)"记舆,只依賴于輸入的參數(shù)鸽捻,任何時(shí)候只要參數(shù)相同,引用函數(shù)所得到的返回值總是相同的泽腮。
百科里這么解釋:
引用透明(Referential Transparent)的概念與函數(shù)的副作用相關(guān)御蒲,且受其影響。如果程序中任意兩處具有相同輸入值的函數(shù)調(diào)用能夠互相置換诊赊,而不影響程序的動(dòng)作厚满,那么該程序就具有引用透明性。它的優(yōu)點(diǎn)是比非引用透明的語言的語義更容易理解碧磅,不那么晦澀碘箍。純函數(shù)式語言沒有變量遵馆,所以它們都具有引用透明性。
我的理解是這個(gè)函數(shù)只處理了輸入的值丰榴,沒有改變外部的其他變量的狀態(tài)团搞,不會(huì)產(chǎn)生副作用。
(3)函數(shù)式語言主張不變量的原因是什么多艇?
不可變性首先解決了線程安全的問題。
其次通過聲明區(qū)分可變和不可變性降低了復(fù)雜度像吻。我們可以更加關(guān)注變化的value峻黍,增加了一種語義。當(dāng)我們看到一個(gè)值聲明是可變的拨匆,我們會(huì)知道這個(gè)值在后面的代碼中會(huì)被賦值姆涩。
三、編程題:
(1)基于變量不可變(任何變量不允許二次賦值)來實(shí)現(xiàn)一個(gè)計(jì)算最大值的函數(shù)惭每,定義如下
<code>int max(int *array, int count) </code>
直接用swift寫了骨饿,這個(gè)count參數(shù)理解為前多少個(gè)數(shù)里的最大值:
func maxNumbers(array:[Int],count:Int) -> Int {
if count==2 {
return biggerNumber(array[0], y: array[1])
}else{
let lastNumber=array[count-1]
return biggerNumber(lastNumber, y: maxNumbers(array, count: count-1))
}
}
func biggerNumber(x:Int,y:Int) -> Int {
return x>y ? x:y
}
//test case
let nubmers=[1,4,23,56,2]
let result = maxNumbers(nubmers, count: 5)
(2)自由發(fā)揮寫一個(gè)高階函數(shù)應(yīng)用的例子,要求必須有返回函數(shù)的部分
寫了一個(gè)獲取兩個(gè)數(shù)計(jì)算的方法工廠:
func calulatorFactory(operatorIdentifer:String) -> (Int,Int)->Int {
switch operatorIdentifer {
case "*":
return { x,y in
return x*y
}
default:
return {x,y in
return x+y
}
}
}
//test case
let multipyFunc=calulatorFactory("*")
let calResult=multipyFunc(3,5)