熊杰在一个关于动态语言的讲座中提到“函数式”编程很重要,哪位可以解释解释函数式编程具体是什么意思?
熊杰在一个关于动态语言的讲座中提到“函数式”编程很重要,哪位可以解释解释函数式编程具体是什么意思? 问题点数:10、回复次数:12Top
1 楼ChumpKlutz(朽木)回复于 2006-05-23 08:52:14 得分 0
也许说的就是像C一样的函数吧Top
2 楼tczyp()回复于 2006-05-23 18:50:29 得分 0
熊杰提到说无论学什么语言都不重要,重要的是学会函数式编程,可见函数式编程的重要性,但是到现在我还不知道函数式编程为何物,真叫人沮丧啊...Top
3 楼DelphiNew(沙鼠)回复于 2006-05-23 23:19:17 得分 0
去找本SICP来看看,你就会明白了。。
Top
4 楼trackant(蚁迹寻踪)回复于 2006-05-24 20:02:56 得分 0
个人认为函数式编程最重要的特征是所有的操作都是无副作用的。所以纯的函数式语言里是没有赋值操作,一个函数一经定义就不能更改,所以函数都是可重入的。也就是说,对于一个函数,不管你是在什么时候调用,在什么环境下调用,只要参数一样,返回的结果都应该是一样的。
目前函数式编程在理论上的价值更大一些,比如他潜在的并行性等。但有些操作似乎无能为力,比如随机数生成函数,输入输出函数等等。Top
5 楼tczyp()回复于 2006-05-25 12:44:57 得分 0
"对于一个函数,不管你是在什么时候调用,在什么环境下调用,只要参数一样,返回的结果都应该是一样的。"
这个原则也基本上适用于非函数式编程吧,比如c++,如果定义一个函数里面,没有静态变量,全局变量,没有调用随机函数,那么这个函数也是对于同样的参数有同样的相应的。那么是不是说函数式编程是非函数式编程的一个子集?Top
6 楼tczyp()回复于 2006-05-27 16:54:06 得分 0
???Top
7 楼sunspot_lee()回复于 2006-05-27 17:28:24 得分 0
函数式编程是与命令式编程相对的,传统的C、Basic等语言编写的程序可以看作一个状态机,这个状态机接收外部的命令或消息改变自身的状态并执行相应的动作。这些状态实现的时候就是全局变量、对象之类的东西。函数式编程写出来的程序可以看做一个变换,把输入的数据变换成输出结果,内部没有状态。
函数式编程以函数为中心,没有变量的概念,所以便于进行程序的理论推导和证明,其实这种程序写出来就不容易出错。纯粹的函数式编程是没有输入输出之类的,不过实际上真正的语言都有处理输入输出的机制的。
个人认为函数式编程适合解决纯粹的算法问题,目前流行的面向对象编程适合对真实动态世界建模。Top
8 楼tczyp()回复于 2006-05-31 12:10:06 得分 0
我很难想象如果没有变量的程序是怎么编写的,比如一个简单的加法运算,如果没有变量,怎么进行程序编写?能否简单地举例解释解释?Top
9 楼sunspot_lee()回复于 2006-06-07 14:02:19 得分 10
比如计算一元二次方程的根,用Haskell写
roots (a, b, c) = if d >= 0 then (x1, x2) else error "b*b-4*a*c < 0" where
x1 = (-b + sqrt d) / (2 * a)
x2 = (-b - sqrt d) / (2 * a)
d = b * b - 4 * a * c
这里面的d不是变量,而是一个别名
再有非波那奇数列
fib@(1:tfib) = 1 : 1 : [ a+b | (a,b) <- zip fib tfib ]
再有经典的快速排序
qsort [] = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
Top
10 楼shhgs()回复于 2006-06-08 07:51:12 得分 0
我从来没觉得函数式编程有什么很了不起的。
就是铺一条流水线。跟bash的管道没什么区别,只不过做成了编程语言。
其实OOP也可以铺流水线,只是你不会那么去想而已。
俗话说一把榔头在手,看什么都像钉子。学了OOP,眼睛里就只有对象了。
学学函数式编程也好,拿到OOP里面,可以如虎添翼。但是纯的函数式编程,恕我直言,并不怎么实用。Top
11 楼evanmengcn(evan)回复于 2006-06-14 17:21:37 得分 0
那鸟人的话,不听比较好……Top
12 楼FIGLAB(无花果)回复于 2006-06-29 23:21:42 得分 0
其实,都有其存在的意义。
函数式,结构式,面向对象式,都有它们的应用也都有它们的思想。
函数式也有它的思想,就像结构式和面向对象式就有着它不同的思想;如果思想跟不上应用就不用说了。
函数式的语言主要有scheme, lisp。而其比较典型的就有:lambda函数。Top




