2009-10-26

Pure v.s Impure

在函数式编程领域有所谓Pure和Impure之分。简单来说,两者之间的区别就是Impure是有side-effect的,比如:赋值、异常和continuations;而Pure则意味着对于一个函数来说相同的输入一定会产生相同的输出,函数中也没有赋值操作这些用以改变某个状态的行为。Scheme和Standard ML是Impure的,而Miranda和Haskell则选择了Pure。

Pure有一个优点就是计算不依赖于执行顺序,因而可以容易的达到较好的并发性能、以及实现惰性求值(Lazy Evaluation);而Impure则使得程序更直观、紧凑。比如,有个函数foo(),如果我们要修改它,得到整个程序中foo()的执行次数。在Impure系统中,这相当容易:添加一个变量记录foo()的执行次数即可。在Pure家族,这就不是如此简单了,我们可能需要修改foo的输入和输出:在输入中记录已经执行的次数,而输出中返回更新的次数 -- 而且糟糕的是,我们需要修改所有涉及到foo()调用的地方。

有人会想,我写个程序不就是为了得到某些输出吗?如果一个语言都不能改变状态(显然,输出涉及到屏幕状态的改变),那又有何用?如果读者以为Pure实在是没啥搞头,那就言之太早了。在Haskell中,程序员喜欢用Monad来模拟以上所有Impure的行为。

标签:

2 Comments:

At 03:20, Anonymous kk said...

不是很理解,能不能写两段code来说明一下?还是说pure和impure主要区别在compiler上?

 
At 03:28, Anonymous live4thee said...

待会写吧。:)

 

发表评论

<< Home