论坛首页 Java企业应用论坛

Java 语言中的函数编程

浏览 69711 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-09-16  
http://www-900.ibm.com/developerWorks/cn/java/j-fp/
这篇东西,用java大致描述了一下FP的概念,但是由于Java本身的限制很多东西说的很不清楚。翻译很差劲,不过就着代码还能看得懂。有什么问题,尽管提问吧。
   发表时间:2004-09-16  
看的我晕乎乎的,差点儿睡着了,文字生硬,故弄玄虚,不好理解,还不如另一篇总结说的明白:
http://www-900.ibm.com/developerWorks/cn/linux/sdk/python/charm-10/index.shtml
引用

从个人角度来说,我会将函数编程粗略地描绘为至少具有以下几个特征。称得上函数性的语言使这些事情变得简单,而使其它事情变得困难或不可能:

函数是第一类(对象)。即,可以对“数据”进行的每样操作都可以使用函数本身做到(例如将一个函数传递给另一个函数)。
将递归用作主要的控制结构。在某些语言中,不存在其它“循环”构造。
重点集中在列表 LISt 处理(例如,名称 Lisp)。列表经常和子列表的递归一起使用以替代循环。
“纯”函数语言能够避免副作用。这不包括在命令语言中最普遍的模式,即指定第一个,然后将另一个值指定给同一个变量来跟踪程序状态。
FP 不鼓励或根本不允许出现语句,取而代之是使用表达式求值(换句话说,即函数加上自变量)。在很纯粹的情况下,一个程序就是一个表达式(加上支持的定义)。
FP 关心的是计算什么而不是如何计算。
许多 FP 利用了“更高等级”函数(换句话说,就是函数对一些函数操作,而这些函数又对其它函数操作)。

函数编程的提倡者认为所有这些特征都导致更快速的开发更短以及错误更少的代码。而且,计算机科学、逻辑和数学领域的高级理论学家发现证明函数语言和程序的正式性能比命令语言和程序容易得多。
0 请登录后投票
   发表时间:2004-09-16  
我有问题。一等公民和二等公民究竟有什么不同?
0 请登录后投票
   发表时间:2004-09-16  
Fowler 写道
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

感觉FP对此不甚同意。
0 请登录后投票
   发表时间:2004-09-16  
gigix 写道
我有问题。一等公民和二等公民究竟有什么不同?

在Java/C++里,函数不是对象。函数不能作为参数传递给其他的函数,必须透过间接的方式例如函数指针或者interface.这就是2等公民了。
但是我们在数学里,f(g(x))这样的表达是很自然的,但是java/C++中就不行。
0 请登录后投票
   发表时间:2004-09-16  
且慢,f(g(x))怎么不行了?

只要f()可以接受g(x)的返回值就可以了啊?
0 请登录后投票
   发表时间:2004-09-16  
庄表伟 写道
且慢,f(g(x))怎么不行了?

只要f()可以接受g(x)的返回值就可以了啊?


class A
{
public 
    void  a();{}
}

class B
{
public 
    void  b();{}
}


class C
{
public void c1(object p1,object p2);
{
}
public void c();
{
   c1(a,b);;//Is it valid?
   a(b(););;//Is it valid?
}

}
0 请登录后投票
   发表时间:2004-09-16  
我的理解,java中就算是出现了可以用函数代替数据的情况,可能也有些不同的地方
   class A{

       int aa();{}

       void b(int value);{}
 
        public static void main(String[] args);{
                  A  a = new A();;
                  a.b(a.aa(););;                 
        }
  }


上面那种情况,在java里是要先执行aa(),得到了结果,然后再把结果作为参数传进入的,而FP则有所区别,它是lazy的,就是先传函数进去,然后等到需要的时候再执行函数的。不知道这样理解对不对啊?
0 请登录后投票
   发表时间:2004-09-16  
mochow 写道
我的理解,java中就算是出现了可以用函数代替数据的情况,可能也有些不同的地方
   class A{

       int aa();{}

       void b(int value);{}
 
        public static void main(String[] args);{
                  A  a = new A();;
                  a.b(a.aa(););;                 
        }
  }


上面那种情况,在java里是要先执行aa(),得到了结果,然后再把结果作为参数传进入的,而FP则有所区别,它是lazy的,就是先传函数进去,然后等到需要的时候再执行函数的。不知道这样理解对不对啊?

函数编程顾名思义就是针对函数编程。在FP里面我们可以把函数当作抽象的逻辑,这些逻辑独立于数据。然后对这些逻辑进行编程组合,得到一个新的逻辑或者算法。FP也可以说成是针对逻辑的编程,而Java/C++这些可以说是针对数据的编程。这个问题Python的介绍就说的很清楚了。
0 请登录后投票
   发表时间:2004-09-16  
to:Trustno1

我其实是有点明知故问了:)

今天算是我第一天学习FP,所以有些概念“迷糊”。不过一直用命令式思维的人,第一次看FP,难免不“迷糊”吧。

有好些问题,都是想和你讨论的,FP是其中之一,还有模板式的编程。(和泛型编程是不是一回事我也搞不太清)都和OO有重大的区别,而这些区别,往往体现了OO的不足之处,如果我们能够搞清楚,应该能够对我们的java编程,或者说OO编程,大有好处。

下面说我对FP的一些疑惑。

按照我的理解,为计算机编程序,也是为了让他帮我们做事,所以命令式的语言是很容易理解的。而在命令式语言中的计算,也是为了最终决定怎么做这样、那样的事情。

但是函数式语言,就是为了计算(这个理解对吗),因此,I/O概念对于他来说,就非常的别扭,或者说非常的复杂。那么函数式语言如何来做事呢?这个我还不清楚。能不能解释一下。

另外就是,mochow转的那个地址,是介绍Python的,看了这个介绍,让我想起了“多范型编程”,而Haskell是属于“纯函数型语言”,是不是“多范型语言”的能力要强于“单一范型语言”呢?这是第二个疑问。

第三个问题,函数编程,以我现在的理解,感觉很像OO中的Command模式,任何对象,只要实现了一个Command接口,就可以组合调用,而且感觉比单纯的计算数值还要强大,不知道这之前有没有实质性的区别。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics