Nor*_*sey 64
关于函数式编程中的基本概念,没有社区共识.在 为什么函数式编程很重要(PDF)中,John Hughes认为它们是高阶函数和惰性求值.在佩戴头发衬衫:对Haskell的回顾中,西蒙佩顿琼斯说真正重要的不是懒惰而是纯洁.理查德伯德会同意.但是有一大群Scheme和ML程序员非常乐意编写带副作用的程序.
作为一名已经练习和教授函数式编程二十年的人,我可以给你一些被广泛认为是函数式编程核心的想法:
具有适当词法范围的嵌套的一流函数是核心.这意味着你可以在运行时创建,其自由变量可能的参数或局部变量的匿名函数封闭功能,你会得到一个值,你可以返回,投入的数据结构,等等.(这是高阶函数最重要的形式,但是一些高阶函数(如qsort
!)可以用C编写,这不是一种函数式语言.)
用其他函数组合函数来解决问题的方法.没有人比约翰休斯更好.
许多功能程序员认为纯度(不受影响,包括变异,I/O和异常)是函数式编程的核心.许多功能程序员没有.
多态性,无论是否由编译器强制执行,都是功能程序员的核心价值.令人困惑的是,C++程序员将这一概念称为"通用编程".当编译器强制执行多态时,它通常是Hindley-Milner的变体,但功能更强大的System F也是函数式语言的强大基础.使用Scheme,Erlang和Lua等语言,您可以在没有静态类型系统的情况下进行函数式编程.
最后,绝大多数函数式程序员都相信归纳定义数据类型的价值,有时称为"递归类型".在具有静态类型系统的语言中,这些通常被称为"代数数据类型",但是即使在为初始Scheme程序员编写的材料中,您也会发现归纳定义的数据类型.归纳定义类型通常附带称为模式匹配的语言特征,它支持非常一般的案例分析形式.编译器通常会告诉您是否忘记了案例.如果没有这种语言功能,我不想编程(一旦采样成为必需品).
Ben*_*old 40
在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据.它强调功能的应用,与强调状态变化的命令式编程风格形成对比.函数式编程的根源在于lambda演算,这是一个在20世纪30年代开发的用于研究函数定义,函数应用和递归的正式系统.许多函数式编程语言可以被视为lambda演算的装饰.- 维基百科
简而言之,
Apo*_*isp 14
不是直接回答你的问题,但我想指出"面向对象"和函数式编程并不一定是不一致的.你引用的"核心概念"有更多的通用对应物,它们同样适用于函数式编程.
更一般地,封装是模块化的.我所知道的所有纯功能语言都支持模块化编程.您可能会说这些语言比典型的"OO"类型更好地实现封装,因为副作用打破了封装,纯函数没有副作用.
更一般地说,继承是逻辑含义,这是函数所代表的含义.规范subclass -> superclass
关系是一种隐含的功能.在函数式语言中,这用类型类或含义表示(我认为暗示是这两者中更普遍的).
"OO"学校的多态性是通过子类型(继承)实现的.有一种更普遍的多态,称为参数多态(aka generics),你会发现纯函数式编程语言支持它.另外,一些支持"更高种类"或更高阶的泛型(又称类型构造函数多态).
我想说的是,你的"OO的核心概念"并不以任何方式特定于OO.举个例子,我认为事实上并没有OO的任何核心概念.
归档时间: |
|
查看次数: |
21620 次 |
最近记录: |