Haskell 现在能够默认进行严格求值

  • Sergio De Simone
  • 曹阳旭

2015 年 12 月 3 日

话题:函数式编程语言 & 开发AI

为了让开发者在使用 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))。

函数式编程语言 & 开发AI