什么是 FP?
C、Java、Pascal、Ada 等等,都是命令式(imperative)语言。“命令式”的意思是它们由一序列被严格的一条接一条执行的命令(command)组成。
Haskell 是一种 functional 语言。
Functional 程序是一个单一的表达式,执行它即对表达式求值。
任何使用过 Excel(或者别的什么电子表格)的人都有 functional 编程的经验:
问题的焦点在于要计算什么,而不是如何计算。
例如:
* 格子里要么是数字(常量),要么就是公式(由运算符和别的格子构成)
* 我们不指定格子应该以什么样的顺序计算,但是不论计算机以什么样的格子计算,它肯定只有一个结果。
* 计算有些格子之前,可能需要先把另一些格子计算出来,不过这是计算机的事,我们并不关心。我们只关心格子和格子之间的数值关系。
* 我们不指定如何分配内存,而且,我们希望电子表格呈现给我们一个似乎是无穷的格子平面,并且只给那些真的使用的格子分配内存。
* 在很大程度上,我们通过表达式来指定格子值,而不是命令序列来计算值。
根据 Excel 的不能指定重算顺序的特征,有一个有趣的的推论是,赋值概念没有什么用了。
为什么呢?呵呵,如果你不能确切的知道赋值到底发生在何时,那么你也多半不需要它。
这与传统语言如C的程序——它实质上由一些仔细指定的赋值序列所组成,或与Java——调用方法的顺序对于程序的意义是至关重要的,形成强烈的对照。
集中于高层的(high-level)“what”而非低层的(low-level)“how”,正是 functional 编程语言的特性。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
FP 的完全定义是什么,我觉得其实并不重要。
重要的是你知道了些什么,以及如何运用已经知道的这些。
纯学术的讨论也不是我所擅长,FP 的准确定义这个我回答不了你。
对头!
原文里确实有一段 SQL!
http://www.haskell.org/haskellwi ... onal_programming.3F
似乎这个并不能解释什么是才是FP
因为其他的一些语言 (例如 SQL, Prolog)也满足这个特性
另外, 我一直想知道什么才是FP所必须要拥有的元素。 即一门语言拥有了那些特性就可以把它称作FP (不限定于纯FP)
个人理解:
“程序”一词带有一个“序”字,比较偏向 imperative
没有港台的“程式“来的严谨
我觉得严谨吧。
“程序”这个词语在我没学编程之前,就一直是这个意思。
比如商标注册程序,六一表彰大会程序,等等。
这么说,汉语中的 "program" 翻译 (“程序”) 是不是有一点不严谨呢?
然。
不过需要补充的是,“工序性”的这种需求是先天存在的,
的确有很多事就是需要一步一步来,“程序(program)”这个词语也正是这个意思,
所以 Haskell 当中也有“工序”这种性质的代码,
Haskell 管它叫做“动作”。
动作不同于函数,它有副作用(函数没有)。
可以。
是不是可以这样认为:
复制代码