论坛首页 Java企业应用论坛

Java 语言中的函数编程

浏览 69725 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-09-24  
youngS 写道
能否展示一些用来解决实际工程问题的例子?

呵呵,中要害了。好像除了一些真有点“有机”的(比如人工智能等)有些应用外,其他主要是用来描述算法(用它描述,精确,可验证,以后要翻译成Java也不难)。
0 请登录后投票
   发表时间:2004-09-24  
非常的好,开了一次眼界.
在用C++的功能子的时候就非常想了解这方面的东西了.却没有想到在一个Java的论坛里读到。
建议你到某个地方开个专题,专门介绍和讨论,这里可能很多的人不喜欢或不感兴趣。
0 请登录后投票
   发表时间:2004-09-25  
cat 写道
youngS 写道
能否展示一些用来解决实际工程问题的例子?

呵呵,中要害了。好像除了一些真有点“有机”的(比如人工智能等)有些应用外,其他主要是用来描述算法(用它描述,精确,可验证,以后要翻译成Java也不难)。

没学会爬呢,就想跑了。有人说这是浮躁,我到不是这么看。浮躁有浮躁的好处。
working knowledge吗,也就是大多数时候浏览一下Paper就知道是个什么货色的东西。快速,高效,是对付无良奸商们的有利武器。不过总是去学习working knowledge也会出问题。KFC,麦当劳损害了多少青少年的健康阿。
0 请登录后投票
   发表时间:2004-09-25  
Elminster 写道
Trustno1 写道
我是在引用前人的经验么,你看我这一引用你就成了和牛顿一样的前人了。该怎么感谢我?10月4号你帮我付帐吧。
我么,也就是搞搞科普工作。你是已经成为某神的选民,拥有算法助教进阶职业,研习<TACP>这种传奇魔法的,比我够班100倍阿100倍的强者,怎能和我计较这些呢?


我说怎么后背有点发冷呢,原来是有人想要折我的寿啊!就我这种差点在法师试炼中仆街的家伙,和你这样四处传播神的福音的正强者比起来,才是远未够班的废柴呀!况且 lambda 演算属于牧师神术,偶这种只懂一点点图灵机奥术的废柴法师,那是全然不能理解地 ……

程序既是数据这东西,怎么说呢,在我看来属于视角问题,无关于图灵机模型的本质。就图灵机而言,更接近我们平时所说的“程序”这一概念的东西并非是纸带上的内容,而是固化在图灵机本身内部的状态转移函数 —— 若是你也能遇到会在考试中让你构造完成乘法操作的图灵机的 BT 老师,相信你对此的体会一定更深(内心痛哭流涕)。因此,将一个图灵机直接视作一个机械化的算法会比较好,而构造一个图灵机其实就是写一个算法,或者通俗一些,写一段“程序”。受此影响,早期的计算机多数都是专用的,程序固化在计算机里面,而正是冯。诺依曼提出了“通用计算机”的概念,才促成了今天能够执行不同任务的计算机的出现。因此,lambda 演算我不敢妄言,但你要说图灵机模型具有“程序即数据”的性质,我是不以为然的。

至于你后面引的那一段描述,那是我们平时用来分析算法复杂度所使用的“RAM 模型”。这个模型比较贴近现实,用起来方便,而且和图灵机模型有多项式规约关系(是不是平方规约?),所以使用很广泛。不过我也不知道这东东还被称作“冯。诺依曼模型” …… 汗一个,孤陋了。

PS:你倒是同意不同意转载啊?
再 PS:我又不是 ABP 网站的管理员,找我有什么用?而且 ABP 的服务器在国外,估计再 turning 也快不到那里去。

我对你能够通过这样的非人试炼深感同情,有没有变成金脸,沙漏眼,要不要喝草药茶?
转载?等一下吧,等我关于SICP第一章教学任务完成了再说吧。
0 请登录后投票
   发表时间:2004-09-26  
还是说说java中的可能应用吧.

那个谁问, pure fpl怎么处理io, 数据库等天生就是副作用的东西.

我就来说说.

haskell这种pure fpl用的是monad来处理副作用.

不说monad的数学基础. 这东西还是让trustno1来讲解.我只说说思路.

其实思路很简单: 语言是没有副作用的,但是执行环境可以有副作用.

比如, sql是无副作用的,但是不表示sql不会对数据库产生影响.

xslt也是fp,但是你也可以用xalan等东西来产生自己需要的副作用,对么?

monad也是这样.其实我感觉,这东西说穿了就和command pattern差不多.

比如, java里我要实现pure functional的io, 就这样:
interface Io{
}
interface IoFactory{
  Io print(String msg);; 
  Io sequence(Io a, Io b);;
}
class SomeComputation{
  private final IoFactory factory;
  Io doCalculation();{
    Io a = factory.print("hello");;
    Io  b = factory.print("world");;
    return factory.sequence(a, b);;
  }
}

完全functional的算法,所有的副作用都通过一个Io对象来表达. 外界的引擎负责把我返回的Io对象解释成副作用.

这个外界引擎,在haskell里,就是它的main函数的evaluator.
如果它的main函数把一个Io monad对象返回出去, runtime就会把它变成真正的副作用.

对应上面的java代码的haskell代码如下:

doCalculation :: IO ();
doCalculation = do
  print "hello"
  print "world"


当然,这个例子很简单. 没有涉及到从文件中读数据等东西.
haskell的高阶函数, lamda abstraction, 强大的泛形, 再加上一个syntax sugar "do", 让使用这种command pattern描述复杂的io成为可能.
对此, java甚至c++都不可能给出一个完美的模拟.

但是,这并不妨碍我们在编程过程中采取一些fp的设计方法.比如这种把实际副作用和计算方法隔离的思想, 就可以借鉴.

今天时间紧迫.随便说两句,回头我会解释一下另一个非常重要的monad: state monad. 它用来模拟我们平时通过赋值来达到的状态变化.

大家会看到, immutable的状态机是可以实现的. 当然, 你也会看到缺乏泛形和高阶函数是java无法完整采用这种monad设计方法的绊脚石.
0 请登录后投票
   发表时间:2005-01-03  
我跑上Google找Lisp关键字,结果绕了个弯还是回到这里来了。这帖子不顶不行。

最近买了SICP,渐进学习中,无形之中感觉自己高端起来了。

我来说两点琐碎的、无意义的、没有学术价值的看法:

1. 用Python无法进行纯函数式编程,虽然语法上Python并未提供障碍。但是Python解释器无法区分迭代算法和递归算法,这导致当你使用递归来代替迭代结构(用递归代替for, while这样的循环结构),数字较大的时候会导致堆栈溢出。
Python代码: top==500的时候堆栈准会爆掉。

def func_print(top);:
    print top
    top>=0 and func_print(top-1);


而Lisp则可以识别用递归描述的迭代过程(尾递归)。

2.Trustno1讲的太晦涩,包括你在《程序员》杂志上的连载(是你写的吧?)。比SCIP本身晦涩的多。
0 请登录后投票
   发表时间:2005-08-02  
连着看下来了,现在还不能说收获很大,但是震动是很大。Trustno1老师的讲解让我接触到了全新的知识,全新的看问题的视角。遗憾的是老师的课程突然结束了,希望能继续,或者给出老师课程在别的地方的链接。
0 请登录后投票
   发表时间:2006-08-24  
嗯,函数编程对数学家来说比较适用。
0 请登录后投票
论坛首页 Java企业应用版

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