最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Scala函數(shù)式編程過程

 更新時間:2017年10月10日 16:02:04   作者:牧師-Panda  
這篇文章主要介紹了深入理解Scala函數(shù)式編程過程的相關(guān)資料,希望通過本文能幫助到大家,讓大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下

深入理解Scala函數(shù)式編程過程

我們馬上開始一段變態(tài)的過程

如果要求立方和,可以這么做

35 * 35 * 35 
68 * 68 * 68 

沒毛病,抽象一點兒,寫個函數(shù):

def cube(n: Int) = n * n * n 
cube(35) 
cube(68)

省事兒了,如果求1到10的立方和,OK,寫個遞歸

def cube(n: Int) = n * n * n 
 def sumCube(a: Int, b: Int): Int = 
   if (a > b) 0 else cube(a) + sumCube(a + 1, b) 
 
sumCube(1, 10)

變態(tài)一點兒,立方和,平方和,階乘和,依舊寫出它們的函數(shù)并且依次計算沒毛病

def cube(n: Int) = n * n * n 
def id(n: Int) = n 
def square(n : Int) = n * n 
def fact(n: Int): Int = 
  if (n == 0) 1 else n * fact(n - 1) 
 
def sumCube(a: Int, b: Int): Int = 
  if (a > b) 0 else cube(a) + sumCube(a + 1, b) 
 
def sumSquare(a: Int, b: Int): Int = 
  if(a > b) 0 else square(a) + sumSquare(a + 1, b) 
  
def sumFact(a: Int, b: Int): Int = 
  if (a > b) 0 else fact(a) + sumFact(a + 1, b) 
 
def sumInt(a: Int, b: Int): Int = 
  if(a > b) 0 else id(a) + sumInt(a + 1, b)  
 
 sumCube(1, 10) 
 sumInt(1, 10) 
 sumSquare(1, 10) 
 sumFact(1, 10)

然后你發(fā)現(xiàn),你已經(jīng)寫了一堆同樣邏輯的if else,看起來不奇怪么,這種無腦的操作當(dāng)然要避免:

我們要把這些函數(shù)名不同但是處理邏輯相同的渣渣都封裝到一個函數(shù)中,并且這個函數(shù)將作為參數(shù)賦值到高階函數(shù)中,運(yùn)行的結(jié)果只跟傳入的參數(shù)類型有關(guān)系,也就是把cube,square,fact,泛化成一個f

def cube(n: Int) = n * n * n 
def id(n: Int) = n 
def square(n : Int) = n * n 
def fact(n: Int): Int = 
  if (n == 0) 1 else n * fact(n - 1) 
//高階函數(shù)
def sum(f: Int=>Int, a:Int, b:Int): Int = 
  if(a>b) 0 else f(a)+sum(f, a+1, b)
// 使用高階函數(shù)重新定義求和函數(shù)
def sumCube(a: Int, b: Int): Int = sum(cube, a, b) 
def sumSquare(a: Int, b: Int): Int = sum(square, a, b) 
def sumFact(a: Int, b: Int): Int = sum(fact, a, b) 
def sumInt(a: Int, b: Int): Int = sum(id, a, b) 
 
 sumCube(1, 10) 
 sumInt(1, 10) 
 sumSquare(1, 10) 
 sumFact(1, 10)

但是這樣寫,還有個問題,就是前面定義了一堆cube,id的初始定義,后面還要繼續(xù)定義,實際上就是套了一層包裝,不要了,去掉,使用匿名函數(shù)的功能來將調(diào)用進(jìn)一步簡化。多數(shù)情況下,我們關(guān)心的是高階函數(shù),而不是作為參數(shù)傳入的函數(shù),所以為其單獨(dú)定義一個函數(shù)是沒有必要的。值得稱贊的是 Scala 中定義匿名函數(shù)的語法很簡單,箭頭左邊是參數(shù)列表,右邊是函數(shù)體,參數(shù)的類型是可省略的,Scala 的類型推測系統(tǒng)會推測出參數(shù)的類型。使用匿名函數(shù)后,我們的代碼變得更簡潔了:

//保留邏輯較為復(fù)雜的函數(shù)
def fact(n: Int): Int = 
if (n == 0) 1 else n * fact(n - 1) 
 
def sum(f: Int => Int, a: Int, b: Int): Int = 
  if (a > b) 0 else f(a) + sum(f, a + 1, b) 
 
// 使用高階函數(shù)重新定義求和函數(shù)
def sumCube(a: Int, b: Int): Int = sum(x => x * x * x, a, b) 
def sumSquare(a: Int, b: Int): Int = sum(x => x * x, a, b) 
def sumFact(a: Int, b: Int): Int = sum(fact, a, b) 
def sumInt(a: Int, b: Int): Int = sum(x => x, a, b) 
 

sumCube(1, 10) 
sumInt(1, 10) 
sumSquare(1, 10) 
sumFact(1, 10)

寫到這里問題解決的差不多了,但是我們仔細(xì)想想,函數(shù)式編程的真諦,一個輸入到另一個輸出,而不是像這樣兩個參數(shù)傳來傳去,看起來很麻煩,于是乎

def fact(n: Int): Int = 
if (n == 0) 1 else n * fact(n - 1) 
 
// 高階函數(shù)
def sum(f: Int => Int): (Int, Int) => Int = { 
  def sumF(a: Int, b: Int): Int = 
   if (a > b) 0 else f(a) + sumF(a + 1, b) 
 
  sumF 
} 
// 使用高階函數(shù)重新定義求和函數(shù)
def sumCube: Int = sum(x => x * x * x) 
def sumSquare: Int = sum(x => x * x) 
def sumFact: Int = sum(fact) 
def sumInt: Int = sum(x => x) 
 
// 這些函數(shù)使用起來還和原來一樣 ! 
sumCube(1, 10) 
sumInt(1, 10) 
sumSquare(1, 10) 
sumFact(1, 10)

實際上這個時候sum里面?zhèn)魅氲囊呀?jīng)是匿名函數(shù)了,類似于g(f(x))里面的f(x), 你還需要去調(diào)用那個f(x)而不是去腦補(bǔ)運(yùn)算.

我們再來開一下腦洞,既然sum返回的是一個函數(shù),我們可以直接使用這些函數(shù),沒有必要再重復(fù)寫一遍調(diào)用命令了,sumCube(1, 10) 類的語句可以省去不要了。

def fact(n: Int): Int = 
  if (n == 0) 1 else n * fact(n - 1) 
 
// 高階函數(shù)
def sum(f: Int => Int): (Int, Int) => Int = { 
  def sumF(a: Int, b: Int): Int = 
   if (a > b) 0 else f(a) + sumF(a + 1, b) 
  sumF 
}

// 直接調(diào)用高階函數(shù) ! 
sum(x => x * x * x) (1, 10) //=> sumCube(1, 10) 
sum(x => x) (1, 10)      //=> sumInt(1, 10) 
sum(x => x * x) (1, 10)   //=> sumSquare(1, 10) 
sum(fact) (1, 10)       //=> sumFact(1, 10)

最后我們還可以使用高階函數(shù)的語法糖來進(jìn)一步優(yōu)化這段代碼: 

// 沒使用語法糖的 sum 函數(shù)
 def sum(f: Int => Int): (Int, Int): Int = { 
 def sumF(a: Int, b: Int): Int = 
  if (a > b) 0 else f(a) + sumF(a + 1, b) 
 
 sumF 
} 
// 使用語法糖后的 sum 函數(shù)
 def sum(f: Int => Int)(a: Int, b: Int): Int = 
 if (a > b) 0 else f(a) + sum(f)(a + 1, b)

我反而覺得用語法糖更容易理解一點,更傾向于我們學(xué)的數(shù)學(xué)語言。

讀者可能會問:我們把原來的sum函數(shù)轉(zhuǎn)化成這樣的形式,好處在哪里?答案是我們獲得了更多的可能性,比如剛開始求和的上下限還沒確定,我們可以在程序中把一個函數(shù)傳給sum, sum(fact)完全是一個合法的表達(dá)式,待后續(xù)上下限確定下來時,再把另外兩個參數(shù)傳進(jìn)來。對于 sum 函數(shù),我們還可以更進(jìn)一步,把 a,b 參數(shù)再轉(zhuǎn)化一下,這樣 sum 函數(shù)就變成了這樣一個函數(shù):它每次只能接收一個參數(shù),然后返回另一個接收一個參數(shù)的函數(shù),調(diào)用后,又返回一個只接收一個參數(shù)的函數(shù)。這就是傳說中的柯里化,多么完美的形式!在現(xiàn)實世界中,的確有這樣一門函數(shù)式編程語言,那就是 Haskell,在 Haskell 中,所有的函數(shù)都是柯里化的,即所有的函數(shù)只接收一個參數(shù)!

// 柯里化后的 sum 函數(shù)
 def sum(f: Int => Int)(a: Int) (b: Int): Int = 
if (a > b) 0 else f(a) + sum(f)(a + 1)(b) 
 
// 使用柯里化后的高階函數(shù) ! 
 sum(x => x * x * x)(1)(10) //=> sumCube(1, 10) 
 sum(x => x)(1)(10)      //=> sumInt(1, 10)
 

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 淺談架構(gòu)模式變遷之從分層架構(gòu)到微服務(wù)架構(gòu)

    淺談架構(gòu)模式變遷之從分層架構(gòu)到微服務(wù)架構(gòu)

    一般地,架構(gòu)模式大致可以分成兩類,單體架構(gòu)(monolithic architecture)和分布式架構(gòu)(distributed architecture)。
    2021-05-05
  • 匯編語言無效指令錯誤概述

    匯編語言無效指令錯誤概述

    此錯誤僅適用于奔騰 處理器、奔騰處理器與MMX技術(shù)、奔騰OverDrive處理器 和奔騰OverDrive處理器帶有MMX技術(shù)。 奔騰Pro處理器, 奔騰II處理器和i486及更早版本處理器不受影響
    2012-07-07
  • 詳解敏捷過程中的需求管理

    詳解敏捷過程中的需求管理

    企業(yè)在做敏捷轉(zhuǎn)型中,需求無法按時交付的困擾你是否也遇到過呢?
    2021-05-05
  • 詳解windows 環(huán)境下搭建electricSearch+kibana

    詳解windows 環(huán)境下搭建electricSearch+kibana

    這篇文章主要介紹了windows 環(huán)境下搭建electricSearch+kibana,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • vscode安裝git及項目開發(fā)過程

    vscode安裝git及項目開發(fā)過程

    這篇文章主要介紹了vscode安裝git及項目開發(fā)過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 聊聊自學(xué),那些讓你事半功倍的自學(xué)資源(干貨分享)

    聊聊自學(xué),那些讓你事半功倍的自學(xué)資源(干貨分享)

    B站是一個學(xué)習(xí)網(wǎng)站。一入B站深似海,從此游戲是路人。B站雖然視頻資源多,但是內(nèi)容也是五花八門、參差不齊,本文給大家收集了關(guān)于學(xué)習(xí)計算機(jī)編程的視頻,這里有我曾經(jīng)的入門視頻,也有跟朋友交流獲得的,特此篩選了下面這些視頻,分享給大家
    2021-04-04
  • 匯編語言 口算異或xor小結(jié)

    匯編語言 口算異或xor小結(jié)

    向 KernelKiller 致敬,只需要背會以下
    2012-07-07
  • 計算機(jī)二級如何一次性通過?給NCRE焦躁心情降溫!

    計算機(jī)二級如何一次性通過?給NCRE焦躁心情降溫!

    計算機(jī)二級到現(xiàn)階段應(yīng)該如何備考,該聽什么課?該針對哪些考點重點學(xué)習(xí),這些都要做到心里有數(shù),有計劃性。這篇文章為大家分享了計算機(jī)二級備考技巧,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • ffmpeg播放器實現(xiàn)詳解之視頻顯示(推薦)

    ffmpeg播放器實現(xiàn)詳解之視頻顯示(推薦)

    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。這篇文章主要介紹了ffmpeg播放器實現(xiàn)詳解視頻顯示,需要的朋友可以參考下
    2020-07-07
  • Windows API函數(shù)大全(完整)

    Windows API函數(shù)大全(完整)

    Windows API函數(shù)大全,從事軟件開發(fā)的朋友可以參考下
    2012-05-05

最新評論

佳木斯市| 大姚县| 长武县| 五寨县| 宁武县| 调兵山市| 明光市| 阿瓦提县| 华安县| 雅江县| 江门市| 沾益县| 金平| 公主岭市| 三门峡市| 金寨县| 黎平县| 崇信县| 文化| 敦煌市| 白玉县| 应城市| 梁河县| 石阡县| 武平县| 潢川县| 唐河县| 福鼎市| 巴塘县| 永和县| 元谋县| 六盘水市| 梅州市| 衡阳县| 林甸县| 麻阳| 苍溪县| 望江县| 鹤峰县| 馆陶县| 浦县|