我将于明年秋天开始一个本科计算机科学课程,但是我不能真正理解函数式编程中的λ微积分。我可能会完全误解这一点,但是根据斯坦福哲学百科全书中的定义,它只是功能的另一种表示法。
如果仅仅是这样,为什么在常规函数符号上使用λ微积分来计算算法运行时间有什么好处?
我将于明年秋天开始一个本科计算机科学课程,但是我不能真正理解函数式编程中的λ微积分。我可能会完全误解这一点,但是根据斯坦福哲学百科全书中的定义,它只是功能的另一种表示法。
如果仅仅是这样,为什么在常规函数符号上使用λ微积分来计算算法运行时间有什么好处?
Answers:
在计算机科学中,我们希望以严格的数学分析和理解源代码。这是绝对确定证明有趣的属性(例如终止)的唯一方法。为此,我们需要一种对每种结构都具有定义明确的含义的语言。
从理论上讲,这可以是任何具有良好形式语义的语言。但是,为了使事情变得不那么复杂且不容易出错,最好使用一种尽可能简单但仍然能够表达任何程序的语言(即Turing complete)。为了推理命令性代码,有图灵机。但是出于函数编程的原因,存在 -calculus。
基本的 -calculus就像一种函数式编程语言,但是带有很多“包bag”。这不是用来实际编写程序的好语言,也不是有效的语言。只是它简单而富有表现力。例如,我们不需要循环,因为我们可以使用递归来模拟它们。而且我们不需要具有多个参数的函数,因为我们可以使用Currying对其进行仿真。
现在,您可能需要证明不属于基本(未类型化) -calculus的构造的属性。这就是多年来计算机科学家将其扩展到不同方向的原因。例如,由于类型系统的原因,类型 -calculi有很多变体。λ
奇怪的是,很多书都在谈论演算,而没有提到Lisp或Scheme,基于它的现代编程语言,不幸的是,使学生们想到了它古老而又抽象的思想,并且大多是理论性的。学习Lisp或Scheme可以极大地帮助理解演算。λ
如果仅仅是这样,为什么在常规函数符号上使用λ微积分来计算算法运行时间有什么好处?
使用Lisp或函数式编程有很多优点,并且计算算法的运行时间只是一种可能(尽管如果您为此引用一个引用会很有帮助)。由于其功能注释已经存在,有时通过归纳或递归关系确定运行时的公式可能与原始代码有更强或更明显的关系。还简化了该算法的其他类型的分析。
另一个主要优点是语法简单。其他语言的解析器非常复杂,但是Lisp解析器非常简单。因此Lisp是研究解析理论的一种很棒的语言。
另一个关键方面是从逻辑或数学的角度/角度而不是从“计算机科学”的角度分析软件。
正如其他答案所指出的那样,Lisp完全是关于递归而不是迭代,而递归是CS的核心。
有关[ -view]和详细信息的更多建议,请参见[1],这是免费的在线和半著名参考。