为了让开发者在使用Haskell进行编码时更加轻松,目前出现了一种新的严格语言作为Haskell的扩展,这意味着程序在大部分时候都会执行严格求值,换句话说,就是用一种非懒惰求值策略。这个特点已经被加入到GHC的git HEAD游标之中,并且会在GHC的下个版本中发布。
在每个模块中,-XStrict和-XStrictData的pragmas预处理指令都会更改Haskell语言的执行方式,这样程序中的函数、数据类型和绑定就会进行严格求值,而不是懒惰求值。-XStrictData是-XStrict的子集,而且仅仅会影响绑定。当被指定为-XStrict的时候,下面的代码:
data T = C a f x = ... let x = ...
实际上被解释成:
data T = C !a f !x = ... let !x
通过在变量名前追加~指令,就可以在每个模块中恢复懒惰求值策略。这些pragmas预处理指令会在一定程度上改变Haskell的默认执行方式,我们也可以通过在变量名前使用!指令把懒惰求值变为严格求值。
正如严格求值指令的实现者Adam Sandberg所说,这个特点并不会把Haskell变成一个严格语言,而更像是在需要执行严格求值时,为Haskell提供了一个简单的方法来写出更漂亮的代码。Adam还补充说,这个补丁是由500行代码构成,而且大部分是由Haskell扩展语言执行,因此这就让严格绑定功能具有了递归和多态性,并且可以更容易地在需要的地方插入严格注释。
Google公司的开发工程师Johan Tibell,在他的监管下,Sandberg Ericsson使用了严格求值功能,进一步展现了这个功能的优势。例如,在严格Haskell代码中使用bang,可以减少句法噪声和出错的几率,也可以帮助我们了解在改变Haskell默认设置时,是如何影响执行功能。Tibell也谈到了,在使用StrictData时,会有很大的可能对使用了严格构造域的代码库造成适度的改变。另一方面,在使用Strict时,也意味着会对现有的代码库造成大量的更改。
查看英文原文: Haskell Can Now Do Strict Evaluation by Default
感谢张龙对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群 (已满),InfoQ读者交流群(#2) )。