加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

手把手介绍函数式编程:从命令式重构到函数式

发布时间:2019-09-09 18:15:00 所属栏目:评测 来源:佚名
导读:副标题#e# 本文是一篇手把手的函数式编程入门介绍,借助代码示例讲解细腻。但又不乏洞见,第一节中列举和点评了函数式种种让眼花缭乱的特质,给出了『理解函数式特质的指南针:函数式代码的核心特质就一条,无副作用』,相信这个指南针对于有积极学过挖过函

言外之意是,在实践中为了更具体直白地表达出业务,可能不需要进一步抽象成 pluck() 。

  1. print pipeline_each(bands, [call(lambda x: 'Canada', 'country'), 
  2.                             call(lambda x: x.replace('.', ''), 'name'), 
  3.                             call(str.title, 'name'), 
  4.                             pluck(['name', 'country'])]) 

练习5: pluck() 输入是要从每条记录中提取键的列表。试着实现一下。它会是一个高阶函数。

我的实现方案:

  1. def pluck(keys): 
  2.     def pluck_fn(record): 
  3.         return reduce(lambda a, x: assoc(a, x, record[x]), 
  4.                       keys, 
  5.                       {}) 
  6.     return pluck_fn 
现在开始我们可以做什么?

函数式代码与其他风格的代码可以很好地共存。本文中的转换实现可以应用于任何语言的任何代码库。试着应用到你自己的代码中。

想想特工玛丽、伊丝拉和山姆。转换列表迭代为 map 和 reduce 。

想想车赛。将代码分解为函数。将这些函数转成函数式的。将重复过程的循环转成递归。

想想乐队。将一系列操作转为管道。

注:

  1. 不可变数据是无法更改的。某些语言(如 Clojure )默认就是所有值都不可变。任何『变更』操作都会复制该值,更改副本然后返回更改后的副本。这消除了不完整模型下程序可能进入状态所带来的 Bug 。
  2. 支持一等公民函数的语言允许像任何其他值一样对待函数。这意味着函数可以创建,传递给函数,从函数返回,以及存储在数据结构中。
  3. 尾调用优化是一个编程语言特性。函数递归调用时,会创建一个新的栈帧( stack frame)。栈帧用于存储当前函数调用的参数和本地值。如果函数递归很多次,解释器或编译器可能会耗尽内存。支持尾调用优化的语言为其整个递归调用序列重用相同的栈帧。像 Python 这样没有尾调用优化的语言通常会限制函数递归的次数(如数千次)。对于上面例子中 race() 函数,因为只有5个时间段,所以是安全的。
  4. 柯里化( currying )是指将一个带有多个参数的函数转换成另一个函数,这个函数接受第一个参数,并返回一个接受下一个参数的函数,依此类推所有参数。
  5. 并行化( parallelization )是指,在没有同步的情况下,相同的代码可以并发运行。这些并发处理通常运行在多个处理器上。
  6. 惰性求值( lazy evaluation )是一种编译器技术,可以避免在需要结果之前运行代码。
  7. 如果每次重复执行都产生相同的结果,则过程就是确定性的。

【编辑推荐】

  1. PYPL 9 月编程语言排行榜发布,Python 一枝独秀
  2. 用 Rust 开发 Linux 驱动?内核维护者表示愿意接受
  3. 为什么谷歌的开发人员认为敏捷开发是无稽之谈?
  4. 苹果可能以人民币美元 1:1 的兑换率给中国开发者汇款
  5. 编程语言Nim 中文官网现已上线
【责任编辑:张燕妮 TEL:(010)68476606】
点赞 0

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读