QCon 全球软件开发大会(北京站)门票 9 折倒计时 4 天,点击立减 ¥880 了解详情
写点什么

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

2015 年 12 月 03 日

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

2015 年 12 月 03 日 18:00932

评论

发布
暂无评论
发现更多内容

一招让Kafka达到最佳吞吐量

Kevin Wan

go kafka go-zero

Oracle Sql性能优化

大数据技术指南

oracle 大数据 28天写作 3月日更

智慧公安二维码定位报警系统开发,微警务平台解决方案

源中瑞-龙先生

二维码定位报警系统开发 智慧公安 智慧公安扫码

C语言中“野指针”、“悬空指针”是什么?

不脱发的程序猿

c 指针 编程之路 bug 3月日更

【LeetCode】不同的子序列Java题解

HQ数字卡

算法 LeetCode 28天写作 3月日更

微信小程序开发:绑定手机号获取验证码功能

三掌柜

小程序 3月日更

电影AI修复,让重温经典有了新的可能

华为云开发者社区

电影 华为云视频 AI修复 视频增强 经典

朋友,你听说过跨域吗

河磨

spring CORS 跨域

跟公司新招的这个“同事”搭档,工作搬砖太“自动化”了

华为云开发者社区

华为 AI RPA 自动化 员工

TcaplusDB君 · 行业新闻汇编(3月17日)

TcaplusDB

数据库 nosql 后端 TcaplusDB Tcaplus

带你走进与千万数据通信者共成长的“家园”

华为云开发者社区

华为 开发者 网络 华为数据通信 社区

GoPath模式和GoMoudle模式的相爱相杀

happlyfox

golang 28天写作 3月日更

JVM笔记 -- 来,教你类加载子系统

秦怀杂货店

Java JVM 类加载 虚拟机

图解堆排序

Silently9527

Java 排序算法 堆排序

区块链溯源追溯系统开发方案,区块链公共服务平台建设

WX13823153201

区块链溯源追溯系统开发

LeetCode题解:647. 回文子串,动态规划,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

“时间”都去哪儿了?性能调优分析方法与案例详解

京东科技开发者

数据库 客户端

怎么找属于自己最优的2B增长模型?

boshi

销售管理 SaaS 七日更

数据驱动业务:一张大屏掌控城市运行,效率提高95%

一只数据鲸鱼

物联网 数据可视化 智慧城市 智慧园区 智慧交通

SDK 是如何存储事件数据的?

神策技术社区

ios 大数据 存储 数据采集 神策数据

知识图谱上的图神经网络

博文视点Broadview

第8周大作业

八达鸟

拍乐云创始人&CEO赵加雨:深耕18载,打造全景式音视频服务

拍乐云Pano

音视频 WebRTC 在线教育 RTC 实时通信

沙龙报名 | 云计算进入多元架构,云原生时代的挑战与机遇

京东科技开发者

云计算 云原生

JDK8新特性 Fork/Join 的优化

Java小咖秀

Java java8 jdk8 forkjoin fork

架构师训练营第十一周作业 - 命题作业

阿德儿

有道技术沙龙 | AI 语音交互技术在语言学习场景的实践

有道技术团队

人工智能

电商千万级交易的金手指:分布式事务管理

华为云开发者社区

微服务 事务 华为云 分布式事务管理 DTM

上万字详解Spark Core(建议收藏)

五分钟学大数据

大数据 spark 28天写作 3月日更

EGG公链生态项目——EFTalk上的巴莱特定律

币圈那点事

区块链

寻找被遗忘的勇气(十七)

Changing Lin

3月日更

边缘计算隔离技术的挑战与实践

边缘计算隔离技术的挑战与实践

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