我可以列举函数式编程的许多功能,但是当我的朋友问我可以为我定义函数式编程吗?我不能.
我想说纯函数式编程的定义点是所有的计算都是在没有副作用的函数中完成的.也就是说,函数接受输入和返回值,但不改变任何隐藏状态.在这个范例中,函数更接近地模拟他们的数学表兄弟.
当我开始使用Erlang这种具有一次写入堆栈的语言时,这对我来说是固执的.但是,应该澄清编程范例与编程语言之间存在差异.通常被称为功能的语言提供了许多鼓励或强制执行功能范例的功能(例如,Erlang具有一次写入堆栈,高阶函数,闭包等).然而,函数式编程范例可以应用于多种语言(具有不同程度的痛苦).
到目前为止,许多定义都强调了纯度,但是有许多语言被认为是功能性的,并不是纯粹的(例如,ML,Scheme).我认为使语言"功能化"的关键属性是:
高阶函数.函数是内置数据类型,与整数和布尔值没有区别.匿名函数很容易创建和惯用(例如,lambdas).
一切都是表达.在命令式语言中,区分变量状态和影响控制流的语句和产生值的表达式.在函数式语言(甚至是不纯的函数式语言)中,表达式评估是执行的基本单元.
鉴于这两个属性,您自然会得到我们认为具有功能的行为(例如,根据折叠和地图表示计算).消除可变状态是一种使事情更具功能性的方法.
来自维基百科:
在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据.它强调功能的应用,与强调状态变化的命令式编程风格形成对比.
使用功能方法可带来以下好处:
在函数式语言中,并发编程更容易.
FP中的功能永远不会产生副作用 - 这使得单元测试更容易.
生产环境中的热代码部署更加容易.
功能语言可以用数学方法进行推理.
延迟评估提供了性能优化的潜力.
更具表现力 - 闭包,模式匹配,高级类型系统等允许程序员更容易"说出他们的意思".
简洁 - 对于某些类别的程序,功能解决方案更加简洁.
还有更多的细节一个伟大的文章在这里.
能够枚举特征比尝试定义术语本身更有用,因为人们将在连续统一体中使用多种含义的各种语境中的"函数式编程"一词,而单个特征具有单独更清晰的定义,更普遍的同意.
以下是我想到的功能.大多数人使用术语"函数式编程"来指代这些特征的某些子集(最常见/最重要的是"纯度"和"高阶函数").
FP功能:
纯度(又称不变性,避免副作用,参考透明度)
高阶函数(例如,将函数作为参数传递,将其作为结果返回,将动态定义为匿名函数作为lambda表达式)
懒惰(又名非严格评估,与纯度相结合时最有用/最实用)
代数数据类型和模式匹配
关闭
卷曲/部分应用
参数多态(又名泛型)
递归(由于纯度而更突出)
用表达式而不是语句编程(再次,从纯度)
...
您使用上面列表中的功能越多,就越有可能标记您正在进行的功能"功能编程"(前两个功能 - 纯度和高阶功能 - 可能值得获得额外奖励积分.你的"FP得分").