什么是strict function
strict function,严格函数。什么是严格函数呢?
学术上的定义是:
假如有一个函数f。
我们定义。
其中是一个表达式,这个表达式要么没有返回值,要么是一个死循环(或者循环直到出错退出)。
这就是严格函数。
通俗来讲,如果一个函数被调用前,它的参数被完全计算求值了,那么它就是一个严格函数。
与严格函数相反的是非严格函数,非严格函数被调用时,它的参数可能没有被计算求值,这也叫做惰性求值(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,它们的普通函数都是严格的,但是自带的宏系统能够定义非严格函数。