多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

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

來源:程序員人生   發(fā)布時間:2015-06-29 08:51:16 閱讀次數(shù):2502次

本文展現(xiàn)加法和乘法的兩個例子,最后使用MapReduce的思想把二者統(tǒng)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處理,把所有結果累加起來。

對應”加法”、”立方”、”階乘”,實現(xiàn)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這倆參數(shù)在各個實現(xiàn)里都是從左到右?guī)н^去的,可以簡化地重新實現(xiàn)原始的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個方法可以這樣實現(xiàn)

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的思想把兩個計算統(tǒng)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)

全文完 :)

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美一区二区三区精品国产 | 91av成年影院在线播放 | 国产最新精品2020好看的 | 欧美激情视频二区 | 网友自拍视频悠悠在线 | 在线视频一区二区 | 日本成人一级 | 国产精品所毛片视频 | 国产亚洲视频网站 | 亚洲一区二区三区高清网 | 18在线观看网站 | 日韩一级片视频 | 亚洲欧美日韩国产综合久 | 亚洲免费观看 | 深爱激情五月婷婷 | 高清视频在线播放 | 国产成人女人视频在线观看 | 欧美另类69xxxxx免费 | 国产香蕉97碰碰久久人人 | 欧美字幕 | 国产精品亚洲综合 | 91人人区免费区人人 | 国产亚洲精品精品国产亚洲综合 | 网友偷自拍原创区 | 亚洲精品在线不卡 | aⅴ免费在线观看 | 最新中文字幕第一页 | 国产精品视频一区二区三区不卡 | 欧美亚洲国产成人精品 | 亚洲码在线 | 欧美日本高清动作片www网站 | 久久精品国产福利国产琪琪 | a网站在线观看免费网站 | 亚洲小视频在线 | 高清 国产 日韩 欧美 | 天堂在线观看 | 欧美精品一区二区久久 | 欧美日韩一级片在线观看 | 欧美黑粗特黄午夜大片 | 国产激情一区二区三区成人91 | freexxx性欧美vide0高清 |