2020-08-27

笔记-读“Why Functional Programming Matters”

中英转换

  1. functional programming : 函数式编程
  2. higher-order function : 高阶函数
  3. lazy evaluation : 惰性求值
  4. side effect : 副作用
  5. abstraction : 抽象
  6. debug : 调试
  7. glue : 粘连
  8. imperative programming : 指令式编程
  9. assignment : 赋值

这篇论文主要介绍了函数式编程给编程带来的两个新特性,高阶函数和惰性求值。文中给出了一些例子来具体说明这两个特性,以及这两个特性为编程如何带来好处。

首先说一下作者认为的好的代码的标准,这样我们才能更好地理解作者的思路。作者认为好的代码具有下面这些特点:

  1. 容易编写和调试
  2. 可复用性高

为此需要模块化程序设计。正如解决复杂问题的时候,我们将问题分解为一连串小问题,我们把代码设计成一个个小而通用性强的模块,这样同时实现了之前提到的好代码的特性。

在此,作者提出一个新颖的观点,我们分解代码的能力取决于我们粘连代码的能力。我其实没有完全理解他的例子如何体现这句话的。

之前的内容,我希望尽量保证和原文一致,后面的内容仅是我个人对作者文章的理解。可能是错误的。

高阶函数。从文章里看,高阶函数就是用更通用的基本函数组合成一个高阶函数。这里不是在函数里调用别的函数,而是将通用函数用参数传递给别的通用函数,进而实现一个复杂的功能。

举个不是很恰当的例子,比如电脑的usb接口相当于一个通用的模块,外接蓝牙,外接键盘,外接鼠标,是另一个通用模块。我们在不同的usb接口上接不同的外设就实现了不同的功能。usb接口加外设就组成了一个高阶函数。

这么做的好处是显而易见的,和模块可以设计的尽量小,方便维护和调试,同时整个程序的代码也由于高复用性而减小。难点是考验抽象能力,而且这种编写方式会造成程序有很多个抽象层级,每一层都建立在下一层的通用模块上。根据个人经验,新手很容易迷失在这种层层抽象中。对编写者有较高要求。习惯了就会有种搭积木的感觉。

惰性求值。更像是一种补偿,不得不采取的一种技术。函数式编程一个主要目标是消除副作用,惰性求值就是替代部分副作用的功能的。

惰性求值是什么呢?简单讲就是一个输出无限结果的函数,将结果传递给下一个函数时,不是通常的求解出所有值再输出结果,而是只输出一部分,足够了就停止运算了。

这里先说一下副作用和赋值。副作用就是函数产生的除返回值外一切对外部环境的影响。比如修改函数外变量的值,输入输出等。副作用的问题是,改变环境变量后可能会改变其它函数的结果,产生无法预知难以追踪的后果。而函数式编程里的函数没有副作用,并且如同数学里的函数一样,确定的输入产出并且仅产出特定的输出,这样每个函数的结果都是可预期的。

赋值也是副作用的一种,同时也是一把双刃剑。有了它,所以有了很多丑陋的代码;有了它,直观的特性也更容易实现功能。所以现在大部分程序语言都包含了这一特性。但是函数式编程语言要消除它。

sicp这本书中也提到了赋值对编程逻辑的影响,赋值让程序有了时间的概念,代码的先后顺序对最终结果变得有影响。从此也开启了代码错的一大来源。

从作者的牛顿迭代法求根的例子里,可以看出来惰性求值对赋值功能的补偿。牛顿迭代是一个无限的过程,要给一个停止条件才能停止这个无限迭代过程。传统的方法是,利用赋值不断将最新的迭代结果更新到一个变量中,再将这个变量作为输入传递下去,直到精度达到要求。这里我们看到,需要用到赋值来更新变量,不然这个算法无法实现。

但是函数式编程里,不希望出来赋值,haskell 中变量都是静态的,一次赋值之后再不可以改变。要如何实现牛顿迭代法呢?惰性求值的价值就体现出来了。函数式编程中,首先用一个函数输出牛顿迭代的结果。再用一个函数接收这个序列,给出判断停止条件,给出计算结果。惰性求值的价值就在这里,理论上的无限序列并没有完全计算也不可能完会计算,它只计算到判定函数认为可以停止的时候就停止了。而程序编写者是不用考虑这件事情的,解释器自动实现。

这个相当于是将当前状态看作是时间作为坐标轴的函数上的一点。这样就可以看作一个纯粹的函数了。

记录一下想法,我不是程序员,估计有点纸上谈兵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值