什么是函数式编程
2010-09-14 13:13:57 来源:WEB开发网ML派生的语言,如OCaml,是“近乎纯粹的”。它们允许通过像引用和数组这类的东西产生一些副作用,但是大部分你写出来的代码都会是纯函数式的因为它们鼓励这种思考方式。Haskell——另一种函数式语言——则是完全纯函数式的。因为写不纯的函数有时候更加有用和有效,所以OCaml更加实用的。
使用纯函数还有一些理论上的好处。其中一个好处是,如果某个函数是纯粹的,那么如果使用同样的参数对其调用多次的话,编译器就只需要调用该函数一次。在C中有一个很好的例子:
view plaincopy to clipboardprint?
for(i=0;i<strlen(s);++i)
{
//做一些不影响s的事情
}
for (i = 0; i < strlen (s); ++i)
{
// 做一些不影响s的事情
}
如果就这样编译了,那么这个循环是O(n2)因为每次都要调用strlen (s)然后strlen又需要迭代整个s。如果编译器足够聪明可以推断出strlen是一个纯函数同时s又没有在循环中更新过,那么它就可以删除冗余的strlen的调用,就能使函数变为O(n)复杂度。那么编译器真的能这么做吗?在strlen的情况下,可以,而在其他情况下,可能就不行了。
集中于写短小的纯函数可以让你使用一种自地向上的方式来构建可复用的代码,同时边继续边测试每个小函数。而当前时尚的方式是使用一种自顶向下的方式来仔细设计你的程序,不过在作者的经历中,这往往会导致项目失败。
严格性和惰性
C派生的和ML派生的语言都是严格的。Haskell和Miranda则是非严格的,或者说是惰性的。OCaml默认是严格的,不过当必须时也可以进行惰性风格的编程。
在严格语言中,给函数传递参数的时候都是先计算好的,然后把结果传递给函数。例如,在严格语言中,下面的调用肯定会导致“被零除”的错误:give_me_a_three (1/0);;
更多精彩
赞助商链接