Mar*_*rco 22
在函数式编程中,您具有参照透明度,这意味着您可以在不更改程序的情况下将函数替换为其值.这是真正的数学太多,但这个并不总是正确的命令式语言.
甲数学函数被定义为:从一组(A)到另一个(B)映射元素的关系,所述第一组的每个元素映射仅与另一组中的一个.在C中(和其他编程语言一样)这也是事实,你有输入集和输出集(几乎总是只有一个).
那么,主要区别在于,总是如果你f(x)在数学中调用,你会得到相同的答案,但如果你f'(x)用C 调用,答案可能不一样(相同的参数不会得到相同的输出). (我认为这有点假.如果你有两个完全相同状态的机器,它们将输出相同的..但它试图说的是非功能语言中的函数可能不仅仅依赖于你给他们的论据,但是关于程序的其他事情)
数学和C函数之间的另一个区别是,在Math中你不能创建一个从非空集到空集的函数(在C中,这将是:你不需要总是返回一些函数).此外,并非所有函数都是可计算的(我不知道在数学中是否有类似的东西......).你没有无限集的函数(你有有限的内存,所以可能的输入参数集必须是有限的),但在数学中,你可以为无限集定义一个函数(如f:N - > N)和对于不可数集(如f:R - > R)(在C中你有浮点数,但它们只代表一组简化的实数,这是有限的).
最后,要知道函数式编程是最接近数学函数的函数,并且,您可以使用C作为函数式语言(或类似的东西).检查"功能C"
对不起,如果我的英语不好,希望我的回答可以帮到你.
总结:
在C中,您并不总是具有参考透明度.对于相同的输入参数,您的函数可能并不总是给出相同的输出.您可以使用为无限输入集定义的Math函数,但在C函数中,您的输入是有限的.在C函数中,您可以使用不返回任何内容的函数,但在Math中您不能使用该函数(如果您的函数具有非空输入集,则必须使用另一个集合映射每个元素).
它取决于域(我不是指函数的域,我的意思是研究领域),也可能是语言.
在数学中,函数的输入只映射到给定输入值的一个输出(垂直线测试,请记住).在编程中,这可能不完全相同,具体取决于您在"输入"和"功能逻辑"之间绘制线的位置.
例如,让我们假设我们有一个函数rand()来读取大气条件以得到一个真正的随机数.让我们假设一个调用函数将一个整数参数作为各种各样的多重参数.以下是一个功能吗?:
int giveRandAtmosWithMul(int mult)
{
return mult * rand();
}
Run Code Online (Sandbox Code Playgroud)
在数学意义上,如果你认为mult是问题的唯一输入,它可能不是一个函数,但显然rand()也提供输入(即使rand()在机器代码中始终具有相同的入口点).
正如您所看到的,如果没有每个人都同意的标准协议,差异就不能真正客观地定义.