什么是strict function

strict function,严格函数。什么是严格函数呢?

学术上的定义是:

假如有一个函数f。

我们定义f\left(\perp\right) = \perp

其中\perp是一个表达式,这个表达式要么没有返回值,要么是一个死循环(或者循环直到出错退出)。

这就是严格函数。

 

通俗来讲,如果一个函数被调用前,它的参数被完全计算求值了,那么它就是一个严格函数。

与严格函数相反的是非严格函数,非严格函数被调用时,它的参数可能没有被计算求值,这也叫做惰性求值(lazy evaluation)。

惰性求值有什么好处呢?

除可以得到性能的提升外,惰性求值的最重要的好处是它可以构造一个无限的数据类型。

举个栗子:

在纯函数式编程语言Haskell中,一个斐波那契可以如下定义:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

在Haskell中,“:”表示在数列后追加一个元素,tail呢,返回去掉第一个元素的数列,zipWith使用指定的函数(这里是加)来合并两个数列中的元素到一个新数列中。 

这个语句不容易理解,实际上,zipWith相加的是两个数列,fibs和tail fibs,生成的是一个新的数列,追加到了0和1的后面。

fibs是无限长的。如果这里不是惰性求值,那么这条语句将会导致内存耗尽。。。

这就是惰性求值的好处。

 

自然,严格函数就是非惰性求值函数,或及早求值函数。

如果一门编程语言只支持严格函数,那么该语言就可以叫做严格编程语言。

现在几乎所有的编程语言都是严格。

比如,C#,Java,Perl,Python,Ruby,Common Lisp,ML都是严格的。

而Haskell,Miranda,Clean都是非严格的。

但是像C,C++,Scheme,它们的普通函数都是严格的,但是自带的宏系统能够定义非严格函数。

 

posted @ 2015-05-13 21:05  sirlipeng  阅读(381)  评论(0编辑  收藏  举报