提交 9c3a1032 编写于 作者: W wizardforcel

2022-01-08 23:51:54

上级 5602c063
# 简介
# 零、简介
我的管理层总是认为我的程序昨天必须是功能性的。加里·惠勒
我的管理层总是认为我的程序昨天必须是函数式的。加里·惠勒
## 关于这本书
F#不仅仅是另一种编程语言。它主要是为函数式编程而设计的,这既要求也要求对计算机程序有不同的思考方式。函数式编程基于一个非常简单的原则,即行为由输入严格决定,因此相同的输入总是产生相同的行为。函数的行为类似于高中代数中的函数,但可能在包括其他函数和计算在内的多种结构化数据类型下运行,而不仅仅是数字。这个简单的想法对编程实践有许多影响。例如,在命令式语言中,我们很少将函数传递给其他函数,我们经常使用表现出(有意或无意)副作用的可变对象。当使用函数式编程语言时,情况正好相反:函数通常作为参数传递给其他函数,对象是不可变的,除非有意实现,否则没有副作用。
这本书探讨了“如何进行功能性思考”,这与强制性思考非常不同。函数式编程需要考虑计算机程序中类似代数的计算,这些计算是从简单的类似代数的计算中建立起来的。仅仅学习 F#语法是不够的。因此,我将很少花时间讨论 F#语言本身——学习 F#语法的资源有很多,例如 *F#简洁地*[<sup>【1】</sup>](IFP_0010.htm#_ftn1)和 Wikibooks 的 *F#编程*[<sup>【2】</sup>](IFP_0010.htm#_ftn2)如果你对 F#完全陌生,我强烈建议你先通读那两个资源。
这本书探讨了“如何进行函数式思考”,这与强制性思考非常不同。函数式编程需要考虑计算机程序中类似代数的计算,这些计算是从简单的类似代数的计算中建立起来的。仅仅学习 F#语法是不够的。因此,我将很少花时间讨论 F#语言本身——学习 F#语法的资源有很多,例如 *F#简洁地*[<sup>【1】</sup>](IFP_0010.htm#_ftn1)和 Wikibooks 的 *F#编程*[<sup>【2】</sup>](IFP_0010.htm#_ftn2)如果你对 F#完全陌生,我强烈建议你先通读那两个资源。
相反,本书将讨论函数式编程概念,例如:
......
# 第一章基本词汇和概念
# 一、基本词汇和概念
在继续如何像一个函数式程序员一样思考之前,对术语*命令式**函数式*有一个坚实的理解是一个好主意。但在此之前,我们将深入探讨函数式编程中最常被误解的两个术语:*巴结**部分应用*。扎实掌握这些术语对于理解本书后面开发的更高级的概念至关重要。系好安全带,为功能编程过山车的第一次 500 英尺下降做好准备。
......
# 第二章改变思维
# 二、改变思维
与命令式编程相比,函数式编程需要对软件架构有不同的思考方式。业务的第一个顺序是停止思考基于语句的编程,开始思考基于表达式的编程。这意味着从定义系统和从什么中可以得到什么的角度来思考,而不是顺序因果。它将自然地导致从不可变对象的角度来思考,而不是我们都习惯的(大部分是无意识的)可变编程。基于表达式的编程和不可变对象对一个成功的函数式程序员以及我们在函数式编程语言中思考算法的容易程度有着直接的影响。
......@@ -166,7 +166,7 @@
* 命令式编程基于语句。
* 函数编程是基于表达式的。
* 避免返回*单位*(“无效”)的函数,因为这是一个严重的迹象,表明你没有以“功能性”的方式编码,你的函数有副作用。
* 避免返回*单位*(“无效”)的函数,因为这是一个严重的迹象,表明你没有以“函数式”的方式编码,你的函数有副作用。
* 表达式在 F#中“急切”求值,因此出于性能原因,您可能需要明确指示编译器您想要惰性求值。
## 认为不可改变
......@@ -454,7 +454,7 @@
观察我们是如何创建部分应用程序`pwdHash2`的,在评估时,它用 UTF8 编码来编码我们的密码,但是让我们推迟选择实际的哈希算法。我们通过输入原始密码字符串来分配编码密码,通过提供哈希算法对象来完成函数应用。
这个的语法有点乱,因为我们在混合。NET 对象,而不是使用纯 F#函数。然而,我相信这代表了在用 F#编程时您将处理的真实世界,所以我宁愿说明这个语法,而不是一个纯 F#实现。这都是功能性思考的一部分,但是要意识到你仍然必须使用不支持功能流水线和迎合的命令式框架。
这个的语法有点乱,因为我们在混合。NET 对象,而不是使用纯 F#函数。然而,我相信这代表了在用 F#编程时您将处理的真实世界,所以我宁愿说明这个语法,而不是一个纯 F#实现。这都是函数式思考的一部分,但是要意识到你仍然必须使用不支持功能流水线和迎合的命令式框架。
#### 课程
......@@ -1250,4 +1250,4 @@ F#中使用递归来避免可变性。是的,我们可以用 F# as (FSI 控制
### 还点东西!
即使您必须编写一个导致突变或副作用的函数,并且理想情况下您不需要返回任何东西,也要考虑您可能想要返回什么,以便您可以利用函数流水线。通常,只需返回传递给函数的相同参数。但是,由于您不知道调用者将如何使用您的函数,所以请对“功能性”进行编程,以便调用者不受您的函数实现的限制。**
\ No newline at end of file
即使您必须编写一个导致突变或副作用的函数,并且理想情况下您不需要返回任何东西,也要考虑您可能想要返回什么,以便您可以利用函数流水线。通常,只需返回传递给函数的相同参数。但是,由于您不知道调用者将如何使用您的函数,所以请对“函数式”进行编程,以便调用者不受您的函数实现的限制。**
\ No newline at end of file
# 第三章深入
# 三、深入
我们将从一些更简单的概念开始这一部分,这些概念在 C#中不太等价(至少在没有大量工作的情况下),但加深了我们对 F#的理解,并添加到我们的“像 F#程序员一样思考”工具箱中。我们将从闭包和有区别的联合开始,然后转向活动模式和延续传递风格(CPS)。我们将重新讨论使用 CPS 的递归,然后讨论函数式编程新手开发人员最困难的两个主题:单子和计算表达式。
......
# 第四章命令式和功能性互动
# 四、命令式和函数式交互
本节将讨论如何在一个应用程序中一起使用 C#和 F#代码。我们将创建一个简单的应用程序,它的前端用户界面用 C#实现,后端数据管理用 F#实现。无论是创建 Windows 窗体还是与 ASP.NET 一起创建 web 应用程序,混合命令式和函数式编程风格可能是最有效的方法——当然,用于设计窗体或网页的工具,XAML 或 HTML,都对生成 C#或 VB 代码有更多的支持。此外,因为用户界面一直在管理状态,应用程序中本质上可变的部分最好用支持可变的语言来实现。相反,处理数据持久化和转换的应用程序后端通常非常适合 F#,因为不变性对于处理异步流程至关重要。
......
# 结论
# 五、总结
“Visual F#是一种强类型、函数优先的编程语言,用于编写简单的代码来使用 Visual Studio 和解决复杂的问题。NET 框架。F#旨在减少现代企业中计算引擎和数据丰富的分析服务等软件组件的部署时间和复杂性。”[<sup>【66】</sup>](IFP_0010.htm#_ftn66)
......
# 附录 A
# 六、附录 A
树递归的“堆栈”痕迹:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册