函数式程序“在数学上更易处理”的说法是什么意思?

时间:2009-05-08 21:06:57

标签: math functional-programming

功能性程序“在数学上更易处理”的说法是什么意思?

8 个答案:

答案 0 :(得分:9)

这意味着您可以更轻松地证明程序正确(例如,通过数学归纳)。有状态的程序(像大多数用面向对象语言编写的程序)很难通过方程建模,因此很难通过方程和数学定理对它们进行推理。

这可能听起来像是理论上的笨蛋,但具有重要的应用。人们赖以生存的软件(空中交通管制,导弹制导系统等)需要被证明是正确的,因为传统的测试根本无法涵盖所有​​可能的情况。

答案 1 :(得分:5)

维基百科对functional programming的定义始于:

  

在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据。

换句话说,有可能在数学上证明关于功能性程序的事情(几乎)无法证明命令式程序。

答案 2 :(得分:2)

这意味着您可以查看一段代码并更轻松地跟踪程序流程。

由于功能程序不是通过语句的顺序排序来操作,它只返回其他函数调用的结果,因此您可以更容易地将一个调用跟踪到另一个调用。

此外,使用功能程序可以更容易地在数学上证明正确性。

好的,所以查看代码可能并不容易,但是更容易推断代码的作用。 更容易可能不是正确的词。

答案 3 :(得分:2)

这意味着您可以更轻松地应用数学技术来理解用函数式语言或风格编写的程序。例如,您可以使用评估的替换模型来确定此Erlang程序评估的内容:

% function definitions
accumulate(F, Init, []) -> Init;
accumulate(F, Init, [H | T]) -> F(H, accumulate(F, Init, T).
Add = fun(x, y) -> x + y end.

% expression to evaluate
accumulate(Add, 0, [3, 2, 4]).

使用替换模型,最后一行等同于以下各项:

Add(3, accumulate(Add, 0, [2, 4]).
3 + accumulate(Add, 0, [2, 4]).
3 + Add(2, accumulate(Add, 0, [4])).
3 + (2 + accumulate(Add, 0, [4])).
3 + (2 + Add(4, accumulate(Add, 0, [])).
3 + (2 + (4 + accumulate(Add, 0, []))).
3 + (2 + (4 + 0)).

使用函数样式替换具有此类值的变量时,因为一旦赋值变量,其值将始终相同。这反映了变量在数学中的使用方式:变量的每次出现(在同一范围内)总是代表相同的值。相反,当您执行以下C代码时,i的值在不同时间是不同的:

int i;
for (i = 0; i < 10; i++) {
    ;
}

答案 4 :(得分:2)

很难猜出原作者的意思,但区分纯函数语言的一点是,你总是可以用等于等于和代数定律。这意味着您可以计算与程序的方式非常相同,即使用高中代数中的公式进行计算。

这有两个很好的理由:

  • 您将一个复杂的代码片段计算为等效但更简单的代码。

  • 你写了一段“显然没有错误”的简单代码,但事实证明它效率低下。所以你计算出一个与地狱之外的蝙蝠一样的等效版本。

第二种技术的过去大师是牛津教授Richard Bird。他的一些东西,比如他的数独求解器或他实施的Burrows-Wheeler压缩(bzip2)绝对是惊人的。读他的论文!

答案 5 :(得分:0)

您可以在执行代码的某些点声明条件为真或假,或者变量具有特定值等。例如,如果您有一个不可变对象,则可以声明其内容永远不会更改。然后你可以将它传递给一个方法,并且知道你可以在方法返回后继续使用它,它的内容将与调用方法之前的内容相同。

答案 6 :(得分:0)

所有程序最终都是一个大数字(当然是以二进制形式呈现)。功能程序比面向对象程序(所有其他条件相同)更容易转换为该数字,因此在数学上更容易处理。

答案 7 :(得分:0)

在数学中y=f(x)总是为给定的y提供相同的值x。总是,如果有月食,土星与火星不对齐并不重要。

在数学中,函数没有副作用。这意味着如果您解析函数f(x),然后解析函数g(x),则第一个函数根本不会对第二个函数产生任何影响。如果g(2)被定义为会给你一个4,那么世界上没有任何东西可以让g(2)突然给你一个8,这是不可能的。< / p>

函数的值仅取决于它的参数值。

但是对于典型的节目来说,这条规则几乎一直都在被打破;很多功能都有副作用。命令式和面向对象语言强烈鼓励这种编程。

使用纯函数语言,这类问题更容易避免。在函数式语言中,函数具有与数学函数相同的属性,称为“referential transparency”,这意味着您可以使用其已知值替换对函数的调用,并且程序将继续正确计算;如果具有给定参数的函数的值已经知道,则函数不必执行它的正文,因为函数不能有副作用。

这对于证明函数的正确性很有用,也非常有助于优化。

以下维基百科文章可能会引起关注:

Referential transparency (computer science)