我想问一下函数式编程语言和面向过程语言如C的区别

zzutnicholas 2009-07-15 11:51:57

不是很清楚,想听听各位高人的意见。
...全文
1575 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
四哥 2010-12-12
  • 打赏
  • 举报
回复
个人感觉就是没有变量,一切东西就是不可变的。只有函数,输入和输出。
yjjlovewjf 2010-01-04
  • 打赏
  • 举报
回复
楼上的楼上的LS那位。大牛。
lliiqiang 2009-09-27
  • 打赏
  • 举报
回复
像flash都是将函数作为数据类型的一种
chj_2003 2009-09-19
  • 打赏
  • 举报
回复
用函数式语言编程就跟做代数题一样,是在做化简。思维方式也与人在做数学题时类似。
它的主要思想是将一些复杂的函数吧表达成一些简单函数的复合,如果学过可计算理论,或者递归论,或者拉姆达演算的话,理解起来就很容易了。
函数式语言关心的是一个问题是什么样的小问题的组合(what to do?),命令式语言关心的是怎样解决这个问题(how to do?)。
forrestju 2009-08-05
  • 打赏
  • 举报
回复
函数编程比命令编程更好, 但由于它自身的本质(表达式),有些问题用它并不合适,如图的算法, 交互. 为了解决这些问题, 我提出了一种语言ProcessLog.

理想的编程语言 鞠文广

以下纯粹是个人观点, 不代表任何组织或社团.

现在流行的编程语言如Java和C#, 大多是面向对象的, 程序的各部分是通过方法调用连在一起, 其编程范式是命令编程, 即使支持其他范式也包装得很难理解和使用.

面向对象实际上只适合实现抽象数据类型, 让它去完成除此之外的任务确实是勉为其难, 即便能完成也给人不伦不类的感觉, 既不像面向对象编程, 也不像它的前任(过程编程). 这些语言中的对象与物质世界的物质(或对象)很不一致, 它使用方法调用的方式与其他对象进行相互作用, 而这与物质之间的(通过通信或媒介)相互作用是截然不同的, 因此用面向对象无法很确切地模拟现实世界, 更不用说准确地为现实世界建立模型.

这几年流行的web服务虽使程序间交互更方便, 但它从本质上说还是使用”面向对象+命令编程+方法调用”的思路, 在编程方法论上并没有实质的进步.

用现在流行的语言实现的完成复杂功能的程序逻辑不清晰, 原因在于”命令编程+方法调用”的设计机制. 这使程序很难模块化, 副作用无所不在, 因此很难正确实现复杂功能.

为了使程序能准确地为现实世界建立模型, 从而正确性更高, 结构更合理, 模块化程度更高, 因此我提出一种新的编程方法论: 面向进程+函数编程+进程间通信+逻辑编程+约束编程+其他合理的范式(命令编程除外).

在几种编程思想或语言的基础上(见references), 我提出了一种编程语言ProcessLog (全称process logic), 语法概要如下:

1 运算符
(1) ? 输入; c ? x 从输入端口c或通道c上接收输入值放到变量x中
(2) ! 输出; c ! v 把v的值从输出端口或通道c上输出
(3) -> 顺序进行的事件的先后关系
(4) | b : s 分支
(5) || 进程并行
(6) // 附属进程
(7) and, or, not 逻辑运算符
(8) 算术运算符和关系运算符 与Java中相同

2 程序的组成成分
(1) Unit 程序单元
(2) Process 进程
(3) Function 函数
(4) Predicate 谓词
(5) Channel 通道, 有两个端口: in 输入端口, out 输出端口
(6) OutPort 输出端口
(7) InPort 输入端口

3 数据结构
(1) List (函数编程中的List类型, 对List的操作函数与函数编程中相同);
(2) Tuple 元组, 同Clean.
(3) Set 集合
没有数组

4 进程的定义
Process p1 (OutPort pt1, InPort pt2 ){
pt2?x -> pt1! compute(x) -> p1
}

5 进程间相互作用
(1) 进程并行 process1( c1.out, c2.in)|| process2(c1.in, c2.out)
(2) 附属进程 (getE: getElements || getR: getReleasedVersion) // X.(in?method -> getE ! method ? elems -> getR ! em ? rem-> … ->X)

6 函数
[Function] compute(double x)=
| x<=0: x*x+3
| x>0: compute(x-5)* compute(x-3)
函数只能以事件的方式在进程中使用或在其他函数中使用, 不能独立使用.

7 谓词
/* 建图 */
Predicate createGraph(t, graph):-
addNode(t, null, ({},{}), graph1),
getDS(t, graph1.ns, tlist),
addList(tlist, t, graph1, graph).
/* 加节点 */
Predicate addNode(t, null, (ns, es), (ns1, es):-
merge(ns, {t}, ns1).
Predicate addNode(t, upper, (ns, es), (ns1, es1)):-
merge(ns, {t}, ns1),
merge(es, {(upper, t)}, es1).

8 把谓词转换为函数
create(t)= graph
where createGraph(t, graph)

谓词不能独立使用也不能在进程中直接使用, 要在进程中使用需要先转换为函数.

9 程序单元: 包含进程和数据类型
Unit PmethodDAO;
interface
Tuple Method;
Process getLastVersion(OutPort pt1 , InPort pt2);

implementation
Method=(String id, String name, String version);
Process getLastVersion(OutPort pt1 , InPort pt2){

}

指导原则: 程序是由通过通道通信的进程组成的. 数据处理和算法用函数编程实现, 如果函数编程不适用于要处理的问题, 就使用逻辑编程或约束编程.

ProcessLog 现在还没有在机器上实现. 我用该语言重写了实际项目中的一些复杂代码(原是Java代码), 证实用它写的程序确实简单清晰, 有类似数学的简洁美. "7 谓词"就是其中一部分代码.

我的想法是: 应先在纸面上规定它的语法与语义, 再通过使用它编写一些应用程序来发现它的不足,再进而改进它, 再实践, 再改进, 直到它基本完善再在机器上实现. 另外, 大家不要把语言分为中国人提出的还是外国人提出的, 科学无国界, 这里不存在狭隘的爱国主义. 我不是那种技术高手, 但我自信我是一个能将理论很好地联系实践的研究者.

希望有识之士和我一起共同发展这种编程方法论和这门语言.

References
1. CSP
2. JCSP
3. Clean
4. Prolog
5. Delphi

注: 转载时请注明作者.
blooney 2009-07-26
  • 打赏
  • 举报
回复
看Why functional programming matters就是john hughes的入门文章,不错,就能理解了
lhy 2009-07-26
  • 打赏
  • 举报
回复
函数式编程好像没有变量
jsrdfeifei 2009-07-23
  • 打赏
  • 举报
回复

函数式语言(functional language)如ML 、Ocaml等
相对应的应该是
命令式语言(imperative language)如C.
用函数式语言编程就跟做代数题一样,是在做化简。思维方式也与人在做数学题时类似。
下面是ML语言计算阶乘的函数:
fun fac 0=0
| fac n = n * fac (n-1);

用命令式语言编程时,就需要用“机器的方式“思考。要考虑内存,同样的问题大家一定知道怎样用C语言写
int fac (int n)
{
?????????

}
疾似云流 2009-07-23
  • 打赏
  • 举报
回复
参考这里
http://en.wikipedia.org/wiki/Functional_programming
WizardOz 2009-07-21
  • 打赏
  • 举报
回复
我认为函数式编程主要是指,函数也被当作一种数据对象,并且在程序中经常用到匿名函数。
代码执行的过程中产生新的函数。为什么需要这样?这个问题我也不是很理解。不过,我在写
C代码的时候经常发现,很多时候我写了好几次似乎重复的代码,但是由于它们一些细节不一样,
没法封装到一个函数中。也许用lamda可以产生更灵活的局部函数。
用函数式语言往往可以写出很精简的代码。但是对程序员的IQ要求比较高。
我其实不懂函数是语言,只是有点兴趣,不知道我说的对不对。
QQ_370566617 2009-07-16
  • 打赏
  • 举报
回复
我觉得函数式编程,主要是指将过程也作为一种变量
但是编程的风格还是面向对象的

而C语言是面向过程的语言,

3,423

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧