面向对象开发人员的函数式编程 - 第 0 部分
如果你有兴趣阅读西班牙语版的这篇文章,请查看我的博客《开发者的地牢》
如果你一直在关注我最近的文章,你可能知道我一直在学习函数式编程。先声明一下,我是个新手,级别不到12级,不玩PVP,每天连续几个小时杀小怪,算是个新手。
作为一个典型的新手,我努力学习,甚至进入了一个怪物等级远超我水平的地下城。你可能已经猜到,我仍然很害怕,但幸运的是,我的等级正在稳步提升。所以,希望我能给你一个攻略,这样你就不会像我一样掉进同样的陷阱。
根据函数式编程(下文简称FP)书籍,FP根植于数学。如果你像我一样是自学成才的开发者,这听起来可能有点吓人,但一旦你开始掌握它,就会发现它真的很棒。它提供了一些背景概念,你可以借此了解你正在做的事情,从而判断你的做法是否正确。这在面向对象编程中通常不会发生,因为所有概念都是抽象的。
您可能已经发现 FP 就是关于函数的。
在 OOP 中,您通常会设计代表域的类,并以这些类的方法形式赋予它们行为,另一方面,在 FP 中,您将以更简单的术语定义事物,您将创建类型,您将使用函数来操作数据和类型以产生结果。
那么让我们从头开始:
什么是函数?
我知道你在想什么,这家伙是认真的吗?哥们,我知道函数是什么,饶了我吧。好吧,我以为自己也知道,现在我再也不会用以前那种方式看待函数了。FP 定义函数的方式与大多数面向对象编程语言不同,它用数学术语来定义函数。
那么,我们来看看它的定义:
在数学中,函数是集合之间的一种关系,它将第一个集合中的每个元素与第二个集合中的一个元素精确关联起来
等等,什么?
这基本上意味着当你在 JavaScript 中创建像这样的函数时:
function isBiggerThanThree(value) {
return value > 3;
}
isBiggerThanThree(3); // FALSE
isBiggerThanThree(5); // TRUE
此函数是 INT 和 BOOL 之间的关系(是的,我知道 JavaScript 中的类型很时髦),其中对于第一组(INT)上的每个可能值,第二组(BOOL)上只有一个可能的答案。
因此,每次你向这个函数传递一个大于三的数字时,它总是会返回 TRUE。这是无法避免的,如果没有返回 TRUE,那么你就不是在进行函数式编程。不过幸运的是,大多数函数式编程语言(例如 Haskell)都强制你这样做。
这也与您经常听到的 FP 流行词有关,即纯函数的概念,您可能会问它是什么?好吧,纯函数是函数式编程中的常规函数,它们是在计算时不依赖或影响外界的函数,就像我们前几行编写的函数一样,它接收输入,计算并产生结果,就是这样。
我知道你在想什么:
这为什么有用?
- 如果函数在给定相同输入的情况下总是返回相同的值,那么测试就变得很简单,是的,FP 并不是放弃单元测试的借口
- 如果函数在给定相同输入的情况下始终返回相同的值,则可以缓存结果以提高性能,这是一个在 FP 中非常常见的概念,称为Memoization,包含在许多库中,例如Ramda.js 中的方法 memoizeWith
- 如果一个函数不依赖于外部状态,那么我们的代码在并发是通用货币的环境中就会产生奇效。
- 由于我们在数学意义上使用函数,因此适用于数学的属性也适用于编程语言,例如函数组合
函数式编程的核心在于组合,就是将一些执行特定通用行为的小函数组合起来,从而创建更复杂的行为。这需要一种名为函数组合的技术。
我们再来看看函数定义,看看是否符合要求:
函数组合是一种运算,它接受两个函数 f 和 g,并生成一个函数 h,使得 h(x) = g(f(x))
这意味着,如果我们有一个接受 INT 并返回 BOOL 的函数,并且我们有一个接受 BOOL 并返回 STRING 的第二个函数,那么由于组合,我们自动有一个接受 INT 并返回 STRING 的第三个函数,让我们看一个例子:
function isBiggerThanThree(value) {
return value > 3;
}
function mapBoolToHumanOutput(value) {
return value ? 'yes' : 'no';
}
const result = mapBoolToHumanOutput(isBiggerThanThree(3));
在接下来的博客文章中,我将解释与此相关的其他概念,并允许我们创建可以自由传递的新功能,而不仅仅是应用它们。
如果您跟随我踏上这段旅程,我们将成功完成这个地牢,我们将达到了解所有角落、了解所有武器的地步,并且我们将能够在一切完成后保存进度。
希望你喜欢这篇小介绍,我会继续提升你的水平,并指导你完成这个过程。如果你觉得这篇文章有用,请在评论区告诉我;如果你有任何意见或建议,也请在评论区告诉我😄
最后,我列出了这次旅程中我将用到的材料。
目前,我正在学习 Haskell,但这只是一个学习函数式编程的工具。
- 我正在关注麻省理工学院的这门直播课程:范畴论编程,它讲的是范畴论和用 Haskell 进行函数式编程。你可以在线观看并获取课程资料。
- 我也正在读这门课程的一位老师写的一本书:《程序员的范畴论》
- 之后,根据我选择的构建,有很多选项:
HASKELL 构建
我可以通过“从根本上学习 Haskell”或“从原则上学习 Haskell”或“一种编程类型”来继续学习Haskell 。
CLOJURE 构建
我可以换成类似《Clojure 与计算机程序的结构和解释》或本系列同名的书《面向对象程序员的函数式编程》
JavaScript 构建
我可以阅读《函数式编程基本指南》,并使用 Ramda.js 和 RX.js 进行一些实验
目前还不清楚当我达到最高等级时我的角色会变成什么样子,但你可以相信我会分享我在此过程中收集到的所有知识。
文章来源:https://dev.to/patferraggi/functional-programming-for-the-object-orient-developer-part-0-1bgj