到底什么是函数式编程,能做什么,是不是会崛
1个回答
2017-12-17 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517181
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
首先,比较被公认接受的,对于具体的语言来说,是指有一个“一等函数”(first class function)。不过函数这个概念本身就比较混乱。只能具体举例。比如,C++的函数就不是一等的,因为对象类型的值能被传参能被返回,函数类型的值就不行(会退化为函数指针)。换句话说C++的内建的“函数”是阉割的。这类函数式语言一开始以Lisp为代表,基本的理论基础是λ演算。
其次,关于表达式和语句。语句一开始就是Fortran的语法。这种设计其实没有必要,因为脱离更基本的表达式语法,也没法表示计算。Lisp就没有在语法上特意区分出语句。函数式语言的语法设计习惯上不使用语句,因为具有一等函数的表达式的表达能力通常已经足够强。C这样的语言的“语句”除了表达确定的求值顺序外,也就是一种无谓地指令式风格的习惯罢了。
第三,关于存储可变状态。修改状态(典型地,赋值)的程序是指令式范式的。函数式的范式通常避免无谓地修改状态。
极端的情况是语义规则不提供修改状态的接口,如Haskell以及C++的模板元编程,这样的风格称为所谓的“纯函数式”。
纯函数式的“函数”不具有修改值这类副作用(对于C/C++来说,读volatile对象也是副作用),所以对于确定的输入可以保证有确定的输出,且求值时函数调用可以以任意次序被整个替换——非纯函数式因为副作用顺序的不同会导致程序行为的不同。这种性质被称为引用透明性(referential transparency)。
但是注意,纯函数式并不是实现引用透明的必要条件,保证内部状态的修改不影响参数和返回值的关联同样能做到。考虑到和通用需求的差异造成的困难,对于自律的用户来说,纯函数式其实没什么必要,到头来只是一种限制而已。
其次,关于表达式和语句。语句一开始就是Fortran的语法。这种设计其实没有必要,因为脱离更基本的表达式语法,也没法表示计算。Lisp就没有在语法上特意区分出语句。函数式语言的语法设计习惯上不使用语句,因为具有一等函数的表达式的表达能力通常已经足够强。C这样的语言的“语句”除了表达确定的求值顺序外,也就是一种无谓地指令式风格的习惯罢了。
第三,关于存储可变状态。修改状态(典型地,赋值)的程序是指令式范式的。函数式的范式通常避免无谓地修改状态。
极端的情况是语义规则不提供修改状态的接口,如Haskell以及C++的模板元编程,这样的风格称为所谓的“纯函数式”。
纯函数式的“函数”不具有修改值这类副作用(对于C/C++来说,读volatile对象也是副作用),所以对于确定的输入可以保证有确定的输出,且求值时函数调用可以以任意次序被整个替换——非纯函数式因为副作用顺序的不同会导致程序行为的不同。这种性质被称为引用透明性(referential transparency)。
但是注意,纯函数式并不是实现引用透明的必要条件,保证内部状态的修改不影响参数和返回值的关联同样能做到。考虑到和通用需求的差异造成的困难,对于自律的用户来说,纯函数式其实没什么必要,到头来只是一种限制而已。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询