50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

学习 Haskell 的现实意义

  • 2009-02-11
  • 本文字数:1596 字

    阅读完需:约 5 分钟

大约有 750 人评论了《Real World Haskell》的网上预览版。作者之一John Goerzen 近日在与O’Reilly 的访谈中介绍,此书用现实的代码、现实的例子和技巧去介绍Haskell 在业务环境中的应用。在访谈中,Goerzen 解释了他为何认为Haskell 是一门值得学习的语言,剖析了Haskell 的各种特质,还讨论了一些可能令人对Haskell 敬而远之的问题根源。

John Goerzen 承认 Haskell 要求重学大量基础,并且认为对于具有命令式语言及面向对象编程背景的人来说,纯洁性(purity)和惰性(laziness)是最大的观念转变。

他强调在 Haskell 中,“任何有可能改变系统全局状态的事物都被严密隔离”,并“用类型系统标记出来”。这样有助于大大减少实现错误,因为代码中的不纯元素都是静态类型的,编译时即可识别错误。这个特点将 Haskell 与 Python 等语言区别开来。纯洁性也有利于测试,尤其当程序的结构是由许多小函数嵌合而成的时候;比如 Haskell 的纯洁性就有效地降低了通过 QuickCheck(译注:Haskell 开源测试框架)进行测试的难度。

“惰性(laziness)是 Haskell 的中心概念之一。当问到“惰性对现实世界的程序有何帮助?” John Goerzen 着重说明了惰性在 I/O 中的应用:

如果我用 Haskell 写一个小小的过滤器或者解析器,不需要怎么操心按行或者按块读取输入的事情,因为我可以直接用 getContents ,然后把函数一个个串起来。我喜欢用 Haskell 写 Unix 过滤器。

[……] 有了输入端的惰性,也就有了输出端的惰性,因为打印输出的时候不需要立即完成全部求解。[……]

最后你得到的是一个设计非常简明的程序,因为不用折腾输入行的缓冲、迭代之类的事情,而且产生的程序只需要固定大小的内存。

John Goerzen 还谈到 Haskell 在表达能力上的优点,其优势一是来自模式匹配,二是因为函数能把事物表达得既扼要又易读,适合阐述问题之余,又容易看清逻辑推导的步骤。访谈人更是认为可以“用函数和词语建立一套词汇,再用那套词汇去作为书写问题解答的语言”。 “用 Haskell 摆弄函数确实就像用 Perl 摆弄字符串那么简单”,Goerzen 如是说。

然而,Haskell 语言的某些特性可能令来自 OO 或命令式语言的人们敬而远之。比如它的递归方式就“可能有点吓人”,因为类 C 语言所用的“变量递增方式是一种代价非常低的操作”。不过,Goerzen 辩解说,尽管“高级语言一般达不到 C 的速度”,但 GHC 编译器会将递归重写成迭代,“非常高效地把你用递归表达的程序转换成更适合于 CPU 执行的形式”。

有些人认为惰性就是“换来类型推导、纯洁性这些东西,却丢掉了对时间及空间复杂性的掌握”。John Goerzen 认为这个观点要辩证地看:

我举个例子,比如随便用哪种语言写一段程序 [……],要求一次过读入整个文件,然后加以处理。打开文件、调用读取操作、将整个文件读入内存,都是可以的。有些人会假设要处理的文件只有 100K,那么这样做当然没问题。但如果你给他们一个 2G 大小的文件,这种做法就行不通了。

凭着他的经验,John 还批驳了关于 Haskell 的 IO 系统孱弱又难学的说法。他说,Haskell 里吓跑最多人的怪兽要数 Monad,但他要强调“无需挠破头去理解什么是 Monad、Modad 做些什么,照样可以写出无懈可击的 Haskell 程序去处理 IO[之类的现实工作]”。比如使用 IO monad,不需要以理解 Monad 为前提,粗浅地把 Monad 当作“一种分隔纯与不纯代码的盒子”就足够了

总而言之,John Goerzen 认为虽然“要把 Haskell 里的各种东西都叫上名字要费不少功夫”,不过之后会顺畅许多,因为“看函数的类型就能把它们的所作所为知道得八九不离十”。照他看,探索 Haskell 是一桩赏心乐事,哪怕 Haskell 不会成为万众瞩目的明星,但“那么别致又有趣的语言,怎么都值得学一学。”

InfoQ 中文站补充消息:《Real World Haskell》中文版正由 AlbertLee 翻译之中,他在博客上放出了一部分预览章节

查看英文原文: What Makes Haskell Worth Learning for Real World Applications

2009-02-11 01:3812710
用户头像

发布了 225 篇内容, 共 72.7 次阅读, 收获喜欢 52 次。

关注

评论

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

2022年“259”号文下聚合支付发展洞察

易观分析

金融 聚合支付 收款码

教你用JavaScript实现轮播图

小院里的霍大侠

JavaScript 编程开发 初学者 入门实战

云渲染哪个平台费用低?云渲染怎么收费

Renderbus瑞云渲染农场

云渲染 云渲染收费

浪潮信息正式发布基于龙蜥 Anolis OS 的服务器操作系统 Inspur KOS

OpenAnolis小助手

开源 操作系统 龙蜥社区 浪潮信息 KOS

2022-12-23:portainer是docker的web可视化工具。如果根据docker部署去写yaml,默认local是k8s,而不是docker,这不符合需求,需要修改yaml。请问部署在

福大大架构师每日一题

云原生 k8s k3s 福大大

linux运维常用脚本

@下一站

12月日更 12月月更 shell脚本 程序代码

阿里云张献涛:高性能计算发展的三大趋势

云布道师

阿里云 弹性计算 高性能计算

Wallys/IPQ4018 12V-56VDCPassive 24V-56V/2*MMCX 27dbm Support MU-MIMO /industrial wifi moudle

wallysmeng

IPQ4018 IPQ4028

身份证扫描简史:科技进步无处不在,从复杂到极简

caidianer

ps 身份证 扫描

Android开发环境搭建

芯动大师

android 开发环境搭建 Androidstudio

如何通过 NFTScan 捕获早期 NFT 项目投资趋势

NFT Research

区块链 NFT

极客时间运维进阶训练营第九周作业

9527

云起无垠入选《ISC 2022数字安全创新能力百强》

云起无垠

跳出程序员思维:如何应对上手英文工具站的几点误区

程序员泥瓦匠

小令动态丨令牌云荣获浦发银行创新社区最佳商业实践奖!

令牌云数字身份

身份认证 浦发银行 璞跃中国

Deel创始人自述销售管理:大中小客户差异化、中美两风格、All hands和Connect机制

B Impact

Spring单例和静态方法

hasWhere

明道云联合RestCloud打造APaaS+IPaaS融合解决方案

明道云

什么样的CRM,才值得企业为之买单呢

ToB行业头条

喜讯|云起无垠实力入选《2022年度中国数字安全能力图谱》

云起无垠

CAS Fuzzing

架构实战营模块二 _ 作业

原城

架构实战营 #架构实战营 「架构实战营」

网易云音乐用户画像资产治理及业务赋能

网易数帆

数据仓库 数据治理 数据资产 12 月 PK 榜

反序列化漏洞小工具绕过

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

数据治理八大优势和四大挑战

用友BIP

HTTP报文首部字段概述

穿过生命散发芬芳

HTTP 12月月更

请求量太大扛不住怎么办?进来学一招

捉虫大师

Go 性能优化

场景 | 九科信息物流供应链领域RPA数字化解决方案

九科Ninetech

小布助手,身入大千世界

脑极体

VUE 前端文本输出为超文本

HoneyMoose

Zebec Chain缘何能成为新晋应用链,熊市下又为何值得我们关注?

西柚子

java运算符类型都有哪些

千锋IT教育

学习Haskell的现实意义_编程语言_Sadek Drobi_InfoQ精选文章