日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Scala Learning(4): Currying柯里化的推演

Scala Learning(4): Currying柯里化的推演

來源:程序員人生   發布時間:2015-06-29 08:51:16 閱讀次數:2507次

本文展現加法和乘法的兩個例子,最后使用MapReduce的思想把二者統1成1個帶Currying的表達情勢。

從high-order functions推演到Currying

原始方法

def sum(f: Int => Int, a: Int, b: Int): Int = if (a > b) 0 else f(a) + sum(f, a + 1, b)

表示從a到b,把每一個int做1次f處理,把所有結果累加起來。

對應”加法”、”立方”、”階乘”,實現3個funtion

def id(x: Int): Int = x def cube(x: Int): Int = x * x * x def fact(x: Int): Int = if (x == 0) 1 else fact(x - 1)

把這3個方法填充到原始的sum方法里,得到3個新方法

def sumInts(a: Int, b: Int) = sum(id, a, b) def sumCubes(a: Int, b: Int) = sum(cube, a, b) def sumFactorials(a: Int, b: Int) = sum(fact, a, b)

將前兩個簡化,把function匿名地傳入sum里,得到

def sumInts(a: Int, b: Int) = sum(x => x, a, b) def sumCubes(a: Int, b: Int) = sum(x => x * x * x, a, b)

寫起來更簡短1些。

進1步的,我們注意到a: Int,b: Int這倆參數在各個實現里都是從左到右帶過去的,可以簡化地重新實現原始的sum方法

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方法傳入1個f,返回值也是1個function,借助新的sum,上面3個方法可以這樣實現

def sumInts = sum(x => x) def sumCubes = sum(x => x * x * x) def sumFactorials = sum(fact)

使用如

sumCubes(1, 10) + sumFactorials(10, 20)

本質上就是Currying的情勢了,展開是:

def sum(f: Int => Int)(a: Int, b: Int): Int = ...

類型是甚么呢?
類型是

(Int => Int) => (Int, Int) => Int

右邊也就是Int,即

Int => Int => Int

Int => (Int => Int)

MapReduce例子

回到加法的例子:

MapReduce例子

回到加法的例子,用Currying的方式改寫為:

def sum(f: Int => Int)(a: Int, b: Int): Int = if (a > b) 0 else f(a) + sum(f)(a + 1, b)

用Currying類似寫1個乘法:

def product(f: Int => Int)(a: Int, b: Int): Int = if (a > b) 1 else f(a) * product(f)(a + 1, b)

注意到,二者在初始值、else分支的計算處理上有所不同,使用MapReduce的思想把兩個計算統1起來:

def mapReduce(f: Int => Int, combine: (Int, Int) => Int, initValue: Int)(a: Int, b: Int) : Int = if (a > b) initValue else combine(f(a), mapReduce(f, combine, initValue)(a+1, b))

把product套進去,可以表示為

def product(f: Int => Int)(a: Int, b: Int): Int = mapReduce(f, (x, y) => x*y, 1)(a, b)

把sum套進去,可以表示為

def sum(f: Int => Int)(a: Int, b: Int): Int = mapReduce(f, (x, y) => x+y, 0)(a, b)

全文完 :)

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 最新日韩精品在线观看 | 精品国产凹凸成av人导航 | 1000部羞羞视频在线看视频 | 成人影片免费 | 国产精品久久久久久久va果冻 | 国产视频久久久 | 亚洲性视频 | 婷婷久| 精品国产传媒 | 国产精品 欧美激情 | 亚洲国产精品成人 | 国产三级网站 | 国产二区自拍 | 国产高清免费 | 国产高清一二三区 | 草久色| 国产精品色综合一区二区三区 | 不卡视频一区二区 | 亚洲天堂电影网 | 69视频免费在线观看 | 国产区网址 | 精品三区视频 | 中国一级特黄毛片大片 | av影片在线 | 国产伦精品一区二区三区在线 | 国产一区不卡视频 | 日韩一区二区在线播放 | 精品99在线 | 久久久蜜臀 | 国产精品日韩欧美一区二区 | 不卡网 | 国产专区在线 | 亚洲性视频在线 | 免费国产在线视频 | 精品一区国产 | 欧美色亚洲色 | 日韩免费av | 国产在线精品一区二区三区 | 在线看亚洲 | 国产在线小视频 | 中文字幕国产精品 |