“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

学习 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:3811986
用户头像

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

关注

评论

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

java时间日期类

Java-fenn

Java

测试开发基础|一文搞定计算机网络(一)

霍格沃兹测试开发学社

公排自动滑落模式智能合约dapp系统开发逻辑详情

开发微hkkf5566

测试面试真题 | 从屡次碰壁到成长蜕变,半年拿下某大厂 60W 年薪测试开发 Offer!

霍格沃兹测试开发学社

测试面试真题|工作2年,从小厂到大厂,薪资翻倍是怎样的体验?

霍格沃兹测试开发学社

微软出品自动化神器Playwright,不用写一行代码(Playwright+Java)系列(二) 之脚本的录制及调试...

Java-fenn

Java

构建测试平台与对应的组织架构需要哪些能力? 21/100

霍格沃兹测试开发学社

测试必会 | 通过容器化 Python Web 应用掌握 Docker 容器核心技能

霍格沃兹测试开发学社

详解:Java 的静态工厂方法

Java-fenn

Java

公私域营销新技术:小程序一键转App

Speedoooo

小程序 APP开发 APP软件开发 小程序容器

外包程序员的开源 Java 低代码开发平台光 2.3.0 Beta4 版发布,显著提升生成物质量

Java-fenn

Java

Java基础 | 如何用Javadoc Tool写规范正确的java注释

Java-fenn

Java

智能遍历测试在回归测试与健壮性测试的应用

霍格沃兹测试开发学社

测试工程师如何突破职场瓶颈?

霍格沃兹测试开发学社

Java注解系统学习与实战

Java-fenn

Java

详解Java中的异常和处理时间

Java-fenn

Java

最流行的接口测试体系,从入门到项目实战

霍格沃兹测试开发学社

测试开发基础 mvn test | 利用 Maven Surefire Plugin 做测试用例基础执行管理

霍格沃兹测试开发学社

测试面试题集锦(二)| 测试工具篇(附答案)

霍格沃兹测试开发学社

数据持久化技术(Python)的使用

霍格沃兹测试开发学社

测试开发基础 | 计算机网络篇(二):物理层与数据链路层

霍格沃兹测试开发学社

Java 函数式编程

Java-fenn

Java

Github点击破百万!这部《从零开始学架构》神书就此霸榜

Java-fenn

Java 程序员 java面试 Java面试题 Java面试Java面试题

测试面试题集锦(六)| 软素质篇与反问面试官篇(附答案)

霍格沃兹测试开发学社

BAT 名企大厂做接口自动化如何高效使用 Requests ?

霍格沃兹测试开发学社

接口自动化你不懂?听HttpRunner的作者怎么说

霍格沃兹测试开发学社

飞书项目负责人洪涛:从抖音研发到飞书项目背后的管理经验

B Impact

飞书 飞书项目

测试面试题集锦(三)| 计算机网络和数据库篇(附答案)

霍格沃兹测试开发学社

测试面试题集锦(五)| 自动化测试与性能测试篇(附答案)

霍格沃兹测试开发学社

Java毕设项目——超市POS收银管理系统(java+SSM+Maven+Mysql+Jsp)

Java-fenn

Java

版本控制神器GitHub的基本使用与踩坑,教你一铲子填平!

霍格沃兹测试开发学社

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