为什么所有的函数式编程教程都这么数学?


20

我一直在尝试学习函数式编程,而我发现的大多数教程都将数学作为更复杂的结构(在某些情况下甚至是简单的结构)的示例。为什么是这样?我想可以使用更简单的方法。这使得它很难学习。

背景信息:我已经编写软件已有12年了。我了解一些概念,例如闭包,作为一等公民的功能和泛型。在某些高级水平上,我可能对高阶函数有疑问,但是我想相信我已经掌握了基本知识。Monads在咬我,这时我还没有超越(我敢肯定,最终,因为我坚持不懈)。


只有一点点,我还没有尝试过其他3种语言你的建议
查尔斯·兰伯特

如果您知道C#,最容易启动F#。不需要大量的数学知识。
2011年

6
尝试SICP-并不会超出中学数学的范围。
SK-logic

@Charles Lambert-观看OfficeSpace,您将获得Job注释的第二部分。
杰蒂2011年

@查尔斯·兰伯特:学到一个伟大的Haskell并不是太数学:D
Matthieu M.

Answers:


21

他们之所以使用数学,是因为函数式编程非常擅长对数学结构进行建模,并且与数学概念(尤其是Lambda微积分)紧密相关。同样,由于在各种功能范式数学的许多语言中,通过各种语言的REPL,I / O通常是相当棘手且高级的学科,因此一开始是一种很好的教学语言的方法。

由于函数式编程将函数视为编程语言中的第一类构造,因此函数生成变得非常重要。因此,高等数学尤其是图论变得相当重要。

祈使语言在数学上也一样,但是由于它们离机器的距离越来越近,反正只能相加,所以它全部都是算术运算。具有较高抽象性的功能语言更倾向于数学。学术界的普遍使用既无济于事,也无济于事,因此由了解很多数学并且正在教期望学习很多数学的人们来教书。因此,可以说它“愚蠢”,但是考虑到这些因素,这是不可能的。

http://learnyouahaskell.com/-可能是函数式编程最温和的介绍之一,我仔细检查了一下,那里没有除基本代数和图论之外的任何内容。


如果您还需要Haskell以外的其他方法,则也可以选择Learnyousomeerlang.com
特拉维斯

11

原因有很多,它们都是相关的:

  • 大多数函数式编程语言是在学术环境中开发的,其中CS与数学密切相关,因此设计它们的人具有很强的数学背景(并且往往对受众有相同的认识)
  • 函数式编程是一种特别适合解决数学难题的范例
  • FP背后的理论,lambda演算(基本上是函数的抽象理论)是数学的一个分支,FP语言倾向于使用lambda演算的概念和术语

而且,FP确实比其他范式还算不上数学,但是关键概念(作为真正的一等公民的功能,高阶功能,闭包和纯正)需要一定的心态。在某个时候,您的思想应该“点击”;如果您理解了这4个核心思想,那么其余的思想可能与任何其他范例一样简单。


3
为学术界开发的+1:人们根据数学属性创建函数式语言,因此它泄漏 ...
Matthieu

@Matthieu M:基于数学属性的编程语言有助于编写正确的软件并减少开发时间。例如,我调试Haskell代码的时间肯定比使用C ++代码的时间少。减少开发时间(和成本)是巨大的实践优势,可以证明学习一些数学方法的合理性。正如tdammers指出的那样,还需要学习一些其他概念,但是在您理解了一些核心思想之后,FP就像命令式编程一样直观。
乔治

我也同意tdammers的观点,即命令式语言也可以使用数学概念来描述。实际上,命令式程序的数学描述通常比功能性程序的数学描述复杂得多。IMO解释了为什么命令式语言更可能包含错误:完全理解命令式代码更加困难。至少,这是我几年的函数式编程和多年的命令式编程的个人经验。
乔治

@ Giorgio:“渗入语言”(以某种方式)和“渗入教程”之间是有区别的。我很确定您可以在不编写太多数学的情况下编写函数式编程教程。当然,他们是否会更好取决于争论和主观。
Matthieu M.

@MatthieuM .:非常感谢您澄清泄漏(泄漏到本教程中)的意思:您的评论对我而言更有意义。我同意您的观点,关于FP的教程应包含尽可能少的数学。我以某种方式曲解了您的评论:在行业和学术界都曾工作过,我对“在学术界中他们所做的许多数学运算在现实世界中是无用的”有点敏感。对于您的评论和tdammer的答案均为+1。
Giorgio

5

这是因为从根本上讲,计算机编程是数学。功能语言的设计考虑了这一点,这就是为什么许多教程都将重点放在数学上的原因。

如果您不习惯将计算机编程视为具有数学基础,这是很难学习的。


4
从根本上讲,计算是逻辑和算术的结合。这不是数学。您不能用数学公式表示分支指令-因此它不能基于数学。函数式编程人群希望它以数学为基础,因此他们开发的程序语言的行为就像分支指令不存在一样。
詹姆斯·安德森

9
@詹姆斯·安德森(James Anderson),您是说逻辑和算术不是数学吗?而且我已经看到了许多包含分支指令的数学公式(通常以类似开关的形式表示)。
彼得·泰勒

4
算术处理简单计算的数学子集。逻辑是数学的超集,它是所有理性思想的基础。顺带提及,函数式编程是解决可以数学表达的问题的好主意。当您尝试遵循不合逻辑的任意规则(例如GAP(公认会计准则))时,它并不是很热门
James Anderson

6
@ ian31,您如何定义“ 从根本上 ” 一词?您知道,土木工程也是基于物理学和数学的,而实际上,这全都在于建造供人们使用和享受的东西。而且,无论如何,在开始考虑为某个实际问题编程解决方案之前,您必须 将该问题转换为某种数学形式主义。只是反而行不通。编程全部关于形式主义。
SK-logic

6
@ ian31,编程语言 形式主义。他们的行为是严格定义和可预测的。因此,对任何特定模型进行编码(即使它含糊不清)也将其转变为某种形式主义。尽管人们普遍认为数学仅限于定义明确的严格模型的清晰透明世界,但数学却可以很好地扩展到这个模糊的领域。
SK-logic

1

我认为“小计划者”是对函数式编程的出色介绍,完全不算什么。它没有进入Monads,因此对于您的口味来说可能太基础了,但确实在最后推导了Y组合器。

自从12年前上大学以来,我没有进行任何函数式编程,最近我通过了它,那是一次很棒的复习,在使用Racket处理了本书中的大多数问题之后,我无疑准备好解决更高级的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.