函数式编程的核心概念是什么?

pie*_*fou 54 functional-programming

在面向对象的编程中,我们可以说核心概念是:

  1. 封装
  2. 遗产,
  3. 多态性

函数式编程会是什么?

Nor*_*sey 64

关于函数式编程中的基本概念,没有社区共识.在 为什么函数式编程很重要(PDF)中,John Hughes认为它们是高阶函数和惰性求值.在佩戴头发衬衫:对Haskell的回顾中,西蒙佩顿琼斯说真正重要的不是懒惰而是纯洁.理查德伯德会同意.但是有一大群Scheme和ML程序员非常乐意编写带副作用的程序.

作为一名已经练习和教授函数式编程二十年的人,我可以给你一些被广泛认为是函数式编程核心的想法:

  • 具有适当词法范围的嵌套的一流函数是核心.这意味着你可以在运行时创建,其自由变量可能的参数或局部变量的匿名函数封闭功能,你会得到一个值,你可以返回,投入的数据结构,等等.(这是高阶函数最重要的形式,但是一些高阶函数(如qsort!)可以用C编写,这不是一种函数式语言.)

  • 用其他函数组合函数来解决问题的方法.没有人比约翰休斯更好.

  • 许多功能程序员认为纯度(不受影响,包括变异,I/O和异常)是函数式编程的核心.许多功能程序员没有.

  • 多态性,无论是否由编译器强制执行,都是功能程序员的核心价值.令人困惑的是,C++程序员将这一概念称为"通用编程".当编译器强制执行多态时,它通常是Hindley-Milner的变体,但功能更强大的System F也是函数式语言的强大基础.使用Scheme,Erlang和Lua等语言,您可以在没有静态类型系统的情况下进行函数式编程.

  • 最后,绝大多数函数式程序员都相信归纳定义数据类型的价值,有时称为"递归类型".在具有静态类型系统的语言中,这些通常被称为"代数数据类型",但是即使在为初始Scheme程序员编写的材料中,您也会发现归纳定义的数据类型.归纳定义类型通常附带称为模式匹配的语言特征,它支持非常一般的案例分析形式.编译器通常会告诉您是否忘记了案例.如果没有这种语言功能,我不想编程(一旦采样成为必需品).

  • 我认为多态性是误导性的.C++中的泛型编程涵盖的内容远不止这些(它通常还使用元编程来实现几种不同的实现,具体取决于类型 - 您所讨论的内容与.NET泛型相比更类似于C++模板/泛型编程).这种形式的参数型多态与OOP程序员所谓的多态无关.如果你把它称为多态类型,我想它会更清晰. (2认同)

Ben*_*old 40

在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据.它强调功能的应用,与强调状态变化的命令式编程风格形成对比.函数式编程的根源在于lambda演算,这是一个在20世纪30年代开发的用于研究函数定义,函数应用和递归的正式系统.许多函数式编程语言可以被视为lambda演算的装饰.- 维基百科

简而言之,

  1. Lambda微积分
  2. 高阶函数
  3. 不变性
  4. 无副作用

  • 9引用维基百科的赞成票?!这是什么世界*? (9认同)
  • 他引用了它的来源,这是一个很好的答案.但是,我会给点+1这个+1. (4认同)
  • 我假设他使用SOAP. (2认同)
  • @Magnus Skog - 纯函数式编程语言是无副作用的.有些语言,比如Lisp和F#,它们是多范式的,可能主要基于函数式编程概念,但却破坏了一些规则.纯函数语言的一个例子是Haskell. (2认同)

Apo*_*isp 14

不是直接回答你的问题,但我想指出"面向对象"和函数式编程并不一定是不一致的.你引用的"核心概念"有更多的通用对应物,它们同样适用于函数式编程.

更一般地,封装是模块化的.我所知道的所有纯功能语言都支持模块化编程.您可能会说这些语言比典型的"OO"类型更好地实现封装,因为副作用打破了封装,纯函数没有副作用.

更一般地说,继承是逻辑含义,这是函数所代表的含义.规范subclass -> superclass关系是一种隐含的功能.在函数式语言中,这用类型类含义表示(我认为暗示是这两者中更普遍的).

"OO"学校的多态性是通过子类型(继承)实现的.有一种更普遍的多态,称为参数多态(aka generics),你会发现纯函数式编程语言支持它.另外,一些支持"更高种类"或更高阶的泛型(又称类型构造函数多态).

我想说的是,你的"OO的核心概念"并不以任何方式特定于OO.举个例子,我认为事实上并没有OO的任何核心概念.

  • 然后你就会遇到定义"对象"究竟是什么的问题,以及它与不是对象的东西的区别.祝好运. (2认同)