GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

学习 Haskell 的现实意义

2009 年 2 月 11 日

大约有 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 年 2 月 11 日 01:3810968
用户头像

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

关注

评论

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

字节跳动,三面我败了!但是我把经验记录了下来,倒下了一个我,还有千千万万个程序员!

Java架构之路

Java 程序员 架构 面试 编程语言

话题讨论 | 每逢佳节胖三斤,过完年你胖了吗?

石云升

话题讨论 减肥 2月春节不断更

RPC框架-dubbo:架构及源码分析-初篇

程序员架构进阶

微服务 dubbo 七日更 28天写作 2月春节不断更

面试官问:在读多写少的情况下,如何优化 MySQL 的数据查询方案

面试官问

MySQL 数据库 面试题 主从同步 读写分离

区块链在医疗领域应用所要面临哪些挑战

CECBC区块链专委会

区块链 医疗

ZEGO全新语音聊天解决方案,4步搭建爆火的语音聊天室

ZEGO即构

入职阿里工作5年,晋升到P8就剩这份学习笔记了,已帮助多个朋友拿到Offer

Java成神之路

Java 程序员 架构 面试 编程语言

你真的了解什么是「暴力解法」吗 ...

宫水三叶的刷题日记

面试 算法 LeetCode 数据结构与算法 贪心算法

滴滴内部分享:如何提高代码的可读性,学习笔记

Java架构师迁哥

十年再出发,Dubbo 3.0 Preview 即将在 3 月发布

阿里巴巴云原生

Java 微服务 云原生 dubbo 应用服务中间件

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

互联网架构师小马

实习记录:PB协议编写

是鱼头啊啊啊

拿到字节跳动offer后,简历被阿里捞了起来,二面竟迎来了P9的“盘问“

Java成神之路

Java 程序员 架构 面试 编程语言

阿里架构师道延:我对技术架构的理解与架构师角色的思考

阿里巴巴中间件

阿里云 架构 云原生 架构师 云原生架构

Linux 多线程详解 —— 什么是线程

赖猫

Linux 线程 Linux内核

4种方法帮你解决IntelliJ IDEA控制台中文乱码问题

华为云开发者社区

Web 虚拟机 编码 IntelliJ IDEA 控制台

MySQL | 使用 limit 优化查询和防止SQL被优化

Java王路飞

Java MySQL 程序员 面试 性能优化

Spring RSocket:基于服务注册发现的 RSocket 负载均衡

阿里巴巴云原生

Java 开发者 云原生 API 应用服务中间件

连续肝了好几天,终于把Java面试必备最重要的基础知识【Java集合】知识点总结整理出来了。

Java成神之路

Java 程序员 架构 面试 编程语言

阿里内部人手一份!P8大佬也叫好的 高性能MySQL系列文档

Java架构之路

Java 程序员 架构 面试 编程语言

【得物技术】Keep-alive 原理及业务解决方案

得物技术

前端 标签 页面 得物技术 keepalive

MySQL详解:索引的介绍和原理分析

程序员小毕

Java MySQL 数据库 程序员 面试

不服不行!阿里曝光内部高并发实战手册,Github星标98K

Java架构之路

Java 程序员 架构 面试 编程语言

架构师week13总结

Geek_xq

新手如何靠区块链赚钱?

CECBC区块链专委会

区块链

追根溯源,有点意思,关于MySQL更新“丢失”问题

互联网架构师小马

在 Kubernetes 上弹性深度学习训练利器 -- Elastic Training Operator

阿里巴巴云原生

人工智能 云计算 容器 云原生 k8s

iOS进阶模块(逆向安防)

ios 逆向

架构师week13作业

Geek_xq

区块链产品走向普及之不完全指南

CECBC区块链专委会

比特币 区块链

连Python都不熟也能跑通AI人脸识别?“隐藏Boss”竟是它!

华为云开发者社区

Python AI OpenCV 人脸识别 图像检测

学习Haskell的现实意义-InfoQ