WEB开发网
开发学院软件开发Java 实战 Groovy: 用 curry 过的闭包进行函数式编程 阅读

实战 Groovy: 用 curry 过的闭包进行函数式编程

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 在这里可以看到名为 map 的闭包,不要把它与 Map 接口混淆,实战 Groovy: 用 curry 过的闭包进行函数式编程(6),map 闭包有一个参数 f 代表闭包,还有一个参数 list 代表(不要惊讶)List,然后在折扣价格上计算销售税,最后,它返回一个新 List,其中 f 已经映

在这里可以看到名为 map 的闭包,不要把它与 Map 接口混淆。map 闭包有一个参数 f 代表闭包,还有一个参数 list 代表(不要惊讶)List。它返回一个新 List,其中 f 已经映射到 list 中的每个元素。当然,Groovy 已经有了用于 Lists 的 collect() 方法,所以我们在我们的实现中也使用了它。

在清单 7 中,我们把事情又向前进行了一步,对 map 闭包进行了 curry 处理,形成一个块,会将指定列表中的所有元素都乘以 12。


清单 7. 添加一些 curry,并乘以 12
import fp.* 
def twelveTimes = { x -> return 12 * x } 
def twelveTimesAll = Functor.map.curry(twelveTimes) 
def table = twelveTimesAll([1, 2, 3, 4]) 
println "table: ${table}"  
// table: [12, 24, 36, 48] 

现在,这 就是我们称之为五星计算的东西!

业务规则用 curry 处理

关于闭包的技艺的讨论很不错,但是更关注业务的人会更欣赏下面这个例子。在考虑计算特定 Book 条目净值的问题时,请考虑商店的折扣和政府的税金(例如 增值税)。如果想把这个逻辑作为 Book 类的一部分包含进来,那么形成的解决方案可能是个难缠的方案。因为书店可能会改变折扣,或者折扣只适用于选定的存货,所以这样一个解决方案可能会太刚性了。

但是猜猜情况如何。变化的业务规则非常适合于使用 curry 过的闭包。可以用一组简单的闭包来表示单独的业务规则,然后用复合把它们以不同的方式组合起来。最后,可以用 计算模式 把它们映射到集合。

清单 8 演示了书店的例子。闭包 rMultiply 是个局部应用程序,通过使用一个不变的第二操作数,把二元乘法改变成一元闭包。两个图书闭包 calcDiscountedPrice 和 calcTax 是 rMultiply 闭包的实例,为乘数值设置了值。闭包 calcNetPrice 是计算净价的算法:先计算折扣价格,然后在折扣价格上计算销售税。最后, calcNetPrice 被应用于图书价格。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:实战 Groovy curry

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接