如何开始函数编程的学习?

如果你习惯命令式语言(OOP),那么FP所有那些声明性代码片段可能会吓到你。确实,函数语言背后确实有很多复杂而美丽的数学。幺半群,仿函数,单子等等,但是你真的必须首先了解所有这些概念后才能开始函数编程吗?

首先从第一个差异声明范式开始,声明式编程的重点是应该做什么事,而不是如何去做(后者是命令式编程)。命令式语言往往集中在一个程序的方法,明确如何实现具体操作及改变程序的状态,而声明式编程表达操作的逻辑(不要着眼于实现)。


def doubleAll(arr):
doubles = []
for elem in arr:
doubles.append(elem*2)
return doubles

def doubleAll(arr):
return map(lambda elem: elem * 2, arr)

当我们谈论函数式编程时,这可能是最流行的例子之一。在第一个doubleAll函数中,我们确切地告诉计算机应该如何做,我们将每个数字的两倍追加到一个新数组中,但之后我们也可以执行另一个操作(例如,递增一些计数器,将其打印到控制台)。我们明确告诉机器如何做到这一点。关于第二个函数,我们不关心实施; 相反,我们专注于应该做什么,通过一个匿名函数map(该函数应用于一个数组,能创建一个新的数组,这个函数完全处理如何实现细节)。

其次,我会说人们应该理解不变性。这是使函数式编程与其他范例有很大不同的事情之一。

函数应被视为数据,这意味着您可以返回函数或将它们作为参数传递,甚至可以组合以获得所需的结果。因为它们是数据,所以它们也应该是纯粹的 ; 这意味着如果你有一个名为is-number它的函数,从字面上看,检查它是否是一个数字。不要试图隐瞒任何其他责任(例如打印到控制台,将一些记录添加到数据库):它必须按照它说的做。

如果要检查它是否为数字,然后将其提交到数据库(或任何其他日志记录材料),请创建另一个函数来访问数据库。然后,您可以将两者组合成所需的输出。当然会产生第三个,不合格 函数(数据库被认为是I / O,而且这个新函数不纯),但是,现在你有两个独立的函数,因此提高了代码的可维护性(和方便调试!)。

原文