苦于基础
我正在尝试自学SML
。 虽然我可以写一些SML代码,但我还没有达到啊哈。
在:
val x = 5;
在命令式编程中,如何将5的value
绑定到名称x
不同于将值5赋给内存位置/变量x
?
上述表述如何阐明“将计算看作数学函数的评估并避免变化状态和可变数据的风格?”?
我必须抛弃关于命令式编程以快速捕捉FP的信息?
请对我温柔。
在命令式编程中,如何将5的值绑定到名称x
不同于将值5赋值给内存位置/变量x
?
函数式编程中的变量与命令式编程中的变量之间的主要区别是函数式编程中的变量不能被修改。
那为什么他们叫做“变量”?
函数式编程语言中的变量不会因您可以修改其值而变化。 然而,它们在数学意义上是不同的,因为它们表示一些未知的常数值。 例如,请考虑以下二次表达式:
这是一个变量的二次表达式。 变量x
变化意味着您可以为x
选择任何值。 但是,一旦为x
选择了某个值,您就不能更改该值。
现在,如果你有一个四分法方程,那么x
的选择不再是任意的。 例如,考虑以下二次方程:
x
的唯一选择是满足方程(即x = -2
或x = -1.5
)的那些。
另一方面,数学函数是两个集合之间的关系,称为域(输入集合)和共域(输出集合)。 例如,请考虑以下功能:
该函数将属于该组实数的每个x
属于该组实数的其对应的2x^2 + 7x + 6
。 再次,我们可以自由地为x
选择任何值。 但是,一旦我们为x
选择了一些值,我们就不允许修改它。
关键在于它们被称为变量,因为它们在数学意义上会有所不同,因此它们可以采用不同的值。 因此,它们随着实例而变化。 但是,它们不随时间变化。
变量的不变性在函数式编程中非常重要,因为它使得程序变得透明(即调用一个函数可以简单地将函数调用替换为函数体)。
如果允许变量随时间变化,那么您将无法简单地将函数调用替换为函数体,因为替换变量可能随时间而改变。 因此,随着时间的推移,您的替代功能体可能会失效。
上述表述如何阐明“将计算看作数学函数的评估并避免变化状态和可变数据的风格?”?
表达式val x = 5;
可以被认为是一个函数应用程序(fn x => y) 5
,其中y
是程序的其余部分。 函数式编程完全是关于函数的,而不变性是指变量只随实例而变化,而不随时间变化。
特别是,可变性被认为是不好的,因为它是隐含的。 任何隐含的内容都可能导致程序中出现无法预料的错误。 因此,Python的Zen明确指出:
显式比隐式更好。
事实上,可变状态是软件复杂性的主要原因。 因此,函数式编程试图尽可能避免可变性。 但是,这并不意味着我们只使用不可变的结构。 我们可以使用可变结构。 我们只需要明确这一点。
我必须抛弃关于命令式编程以快速捕捉FP的信息?
没有。 函数式编程和命令式编程是计算的两种思路。 计算是一个非常抽象的想法。 什么是计算? 我们如何知道可以计算哪些问题? 这些是数学家在上个世纪初所面临的一些问题。
想想计算,我们需要有一个正式的计算模型(即一个捕获计算概念的正式系统)。 有各种计算模型。 然而,最着名的是lambda微积分(这引起了函数式编程)和图灵机(这引起了命令式编程)。
lambda微积分和图灵机在功率上是等效的。 他们都捕捉到计算的概念,每一个可以计算的问题都可以用lambda微积分表达式或等价的图灵机来表示。 唯一的区别是你表达你的问题的方式。
您不必丢弃您了解函数式编程以了解函数式编程的任何知识。 没有一个比另一个好。 它们都是表达同样问题的不同方式。 但是,你需要开始像功能程序员一样思考编写好的功能程序。
链接地址: http://www.djcxy.com/p/80847.html