netcore 函数式编程的优点

在生产中不使用 Haskell 的原因列表

你好!我是 Catherine,我非常喜欢函数式编程;我每天都使用功能语言,甚至做一些教学。在 Typeable,我们使用 Haskell 作为主要开发语言,当其他人都在争论 Haskell 是否已准备好用于生产时,我们只是使用它并将其视为一种竞争优势。基于这一经验,我们想分享一下我们的意见。

FP 如何改进编程

目前,函数式编程相当流行,许多命令式语言都采用了一些 FP 概念,例如 lambda 函数、部分应用(柯里化)和高阶函数(映射、过滤、折叠)。有些采用无缝融合,但有些则使语法看起来相当奇怪和陌生。然而,编程范式是存在于程序员头脑中的一种方法,通常不是语言本身的一部分。在某种程度上,任何语言都支持不同的范式,其结构允许开发各种风格的软件。以函数式风格开发软件是否有意义的问题很难回答,每个开发人员都会根据自己的喜好、语言的功能和其他考虑因素来回答这个问题。

  1. 代码将变得更加简洁和富有表现力。表达力可以定义为每个代码单元的想法数量,一般来说,函数式语言(作为高级语言)也被证明更具表达力。例如,调整数组或列表中的每个元素是通过函数式单行代码(使用 map/foreach/whatever 和匿名函数)来实现的,而命令式风格则需要组织一个循环,为计数器或变量声明一个变量。迭代器,并使用显式赋值。在更复杂的例子中,表达能力的差异更加明显。
  2. 代码会更自然地分解。“分而治之”原则在软件开发中长期使用,并作为软件复杂性管理的基本原则。我说的不是算法设计方法,但关于更一般的概念。例如,即使是一个简单的程序,首先读取整个输入文本,将其分解为单词,并对每个单词执行一些操作,也可以分解为逻辑部分 - 读取本身,将文本分解为单词(例如,通过空格)并创建一个用于存储单词的结构,遍历该结构包括映射单词和结果打印输出。这些操作中的每一个都可以以相当抽象的方式单独实现,以便可以重用它们来解决其他类似的任务。将代码分解为更小、更通用的部分使代码更加清晰(对于将来的作者来说也是如此),防止“复制粘贴错误”,并简化后续重构。我确信很多开发人员偶尔不得不翻阅自己或其他人匆忙编写的非结构化代码壁纸,只是为了让软件正常工作。人脑很难一次性将注意力集中在大量实体上,同时解决一个全局问题(工作记忆),这就是为什么我们很自然地将问题分解为更小的任务,单独解决它们,然后组合结果。在函数式编程中,这些小任务被表示为次要的辅助函数,每个函数都在做自己的工作,可以用一个简短的句子来描述。最终的结果就是这些函数的组合。当然,也可以在 OOP 和纯命令式低级语言(例如 C)中将代码拆分为单独的、可重用的段(使用众所周知的原理,例如 SOLID 和 GoF 模式),但是如果该语言使开发人员从功能角度思考,代码分解得更自然。OOP 模式的 FP 等价物
  3. 副作用将与纯函数分离。纯函数是数学意义上的函数;其运算结果仅取决于输入数据。对这样一个函数的评估不涉及任何超出本质的内容——变量值不会改变,不会读取或打印任何内容,不会创建数据库条目,也不会发出对外部服务的请求。事实上,您不会期望进行此类运算,例如三角函数,不是吗?数据处理逻辑的主要部分可以使用纯函数来实现。并非所有语言都允许您控制副作用的存在并检查函数的“纯度”,但函数式方法本身就激励了纯函数的使用,没有任何“惊喜”。
  4. 调试和测试代码会更容易。这一点源于前两条:我们有许多小函数,其中一些是纯函数,即我们知道它们的结果仅取决于输入数据。代码调试变得更加容易,因为只需要检查单独使用的函数返回的结果即可了解它们协同工作的方式。应用程序“纯”逻辑的单元测试是以同样简单的方式编写的。

FP 如何提高开发人员的能力

猫很高兴使用 FP 猫很高兴使用 FP

另外,我想分享我与用函数式语言编写程序没有直接关系的经验,并告诉您 FP 的知识和应用如何对我有用,并且对您也有用。

  1. 学习替代范式本身对大脑很有用。当您掌握功能风格时,您将学会以新的眼光看待熟悉的事物。有些人会发现这种思维方式比命令式思维方式更自然。我们可以详细争论工业编程中什么是“有用”和“无用”,但无论如何,你需要一个清晰的头脑,这需要培训。掌握工作中不使用的语言:LISP、Prolog、Haskell、Brainfuck、Piet。这将有助于拓宽你的思维,并且可以成为一个令人着迷的脑筋急转弯。随着时间的推移,即使您使用命令式语言编写程序,您也将能够使用更优雅的函数式解决方案。
  2. 函数式语言以严肃的理论为基础,如果您渴望在或多或少的程度上投身于计算机科学,那么它也可以成为您的热情甚至研究的一部分。学习永远不会太晚,尤其是当你清楚地说明如何使用相当有趣的理论来解决日常任务时。我从来没想过,大学毕业后,我会看范畴论(我的大脑曾经无法理解)的讲座,并在纸上潦草地写出问题的解决方案,只是因为我觉得它很有趣。
  3. 除了开阔你的视野之外,对 FP 的兴趣也能帮助你扩大你的社交网络。“功能社区”显然赢得了学术势利眼的声誉,他们要求你在继续对话之前定义“单子”。我也曾经这样想过,直到我被护送去参加我的前几次功能性聚会和会议。我是一个初三的新手,不知道单子的定义,但我从未遇到过负面待遇。相反,我认识了一些有趣的人,他们对自己的工作充满热情,渴望讨论、分享他们的经验和解释。果然,任何社区都是由截然不同的个人组成的。你会非常喜欢其中的一些,而发现另一些有毒和令人厌恶,这是完全正常的。
  4. 对我来说最没想到的是,需要 Haskell 知识的工作是最容易找到的!到今天为止,我已经有五年多一点的工作经验了,并且,在三个就业地点的两家公司中,我使用了 Haskell,这是我能想象到的最舒适、最无痛的就业体验。此外,我一开始是一名 Haskell 开发人员,我从未后悔过这一点。我的第一份工作让我掌握了客户端-服务器架构开发和使用数据库的基本技能。我们曾经像使用更广泛的语言的公司一样解决同样的“脚踏实地”和“不科学”的任务。最有可能的是,您在热门招聘网站上查询“Haskell 开发人员”几乎不会得到任何回复。充其量,您会发现空缺表明替代范式的知识是一种“优势”。然而,这并不意味着此类职位不存在。社交媒体上偶尔会出现职位空缺。是的,他们很少,你需要知道去哪里搜索,但是这个领域的优秀专家也很少。当然,您不会在任何您喜欢的地方立即被雇用,但您会比寻找需要更流行语言的工作更快地感受到自己的就业能力。很可能,公司可能已经准备好投资于他们所需学科的开发人员培训:如果您找不到 Haskell 程序员,请在内部培训一名!但与寻找需要更流行语言的工作相比,您会更快地感受到自己的就业能力。很可能,公司可能已经准备好投资于他们所需学科的开发人员培训:如果您找不到 Haskell 程序员,请在内部培训一名!但与寻找需要更流行语言的工作相比,您会更快地感受到自己的就业能力。很可能,公司可能已经准备好投资于他们所需学科的开发人员培训:如果您找不到 Haskell 程序员,请在内部培训一名!

结论

Python、C++、Kotlin、Swift 等流行工业开发语言中 FP 元素的采用证实了这种方法的实用性和强大功能。函数式风格允许获得更可靠的代码,更容易分解、泛化和测试,而与编程语言无关。当然,函数式语言可以充分利用上述所有优点,产生具有高度表达能力的原生结构。尽管有很多函数式语言,但我们认为,就目前而言,使用静态类型的语言对于开发来说是最方便、最有用的。它们有助于检测编译期间的大多数错误并在类型级别表达部分应用程序逻辑。

最后一点,我想鼓励您使用替代方法并在实践中尝试它们,即使这仅对您自己的自我提高有用。


作者:spike

分类: Net

创作时间:2023-10-18

更新时间:2023-10-18

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1