写点什么

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

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

关注

评论

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

当国产iVX遇上新晋产品PowerPlatform,能否披荆斩棘、稳住阵脚?

代码制造者

程序员 编辑器 低代码 快速开发 开发工具

拥抱开源开放,易观技术开发者的星海征途

易观大数据

海豚调度 调度引擎

最详细的 Spring Cloud OAuth2 单点登录使用教程送给大家

小闫

面试 后端 JVM SpringCloud

Linux 操作系统!开篇!!!

苹果看辽宁体育

Linux

ARTS-week5

王钰淇

ARTS 打卡计划

写给孩子的两本书我读得津津有味

孙苏勇

读书 陪伴 随笔杂谈

「NIO系列」——之Reactor模型

小谈

Spring Boot reactor 后端 nio SpringCloud

去面试Spring Cloud 被问的35个问题

小谈

面试 springboot SpringCloud buffer JVM原理

架构0期Week4作业2

Nan Jiang

面试官:十亿级数据ES搜索怎么优化?我直接傻了

犬来八荒

Java 面试 大厂

模式与重构-作业

秤须苑

使用 Flutter 快速实现请假与写周报应用

LeanCloud

flutter 后端 数据 教程

终于有大佬把TCP/IP协议讲清楚了!面试再也不怂面试官提问了

小闫

jdk JVM Netty buffer TCP/IP

架构0期Week4作业1

Nan Jiang

产业数字化无法“一蹴而就”,而是“长跑冠军”。

CECBC

极客大学架构师训练营 系统架构 分布式缓存 一致性哈希 Hash 第9课 听课总结

John(易筋)

极客时间 极客大学 极客大学架构师训练营 分布式缓存 一致性哈希

到底什么是HashMap?

小闫

Java spring 后端 JVM hashmap

信创舆情一线--英特尔暂停向浪潮供货

统小信uos

服务器 舆情 芯片

谈谈容器和K8s

Gabriel

Java面试常用知识(附赠最新面试题)

架构大数据双料架构师

被“假”老干妈耍惨了?憨憨腾讯花1624万卖萌,引全网吃瓜!

程序员生活志

腾讯 互联网 大厂

七月份最新“美团+字节+腾讯”面试题,测试一下你能走到哪一面?

犬来八荒

Java 面试 线程’

基于 Flagger 和 Nginx-Ingress 实现金丝雀发布

郭旭东

Kubernetes CI/CD

再有人问你分布式事务,把这篇扔给他

码哥小胖

分布式 Java 分布式

游戏夜读 | 关卡设计新手必看

game1night

如何快速将 Linux 系统制作成 ISO 镜像文件?

JackTian

Linux 运维 操作系统 镜像文件 ISO

腾讯的辣酱不香了 支付宝的区块链真能解决“萝卜章”问题?

CECBC

双链通 萝卜章 区块链方案

Google官方MVP+Dagger2架构详解

小吴选手

架构 架构师 架构是训练营

【自学成才系列一】multipass安装篇

小朱

multipass

架构师训练营第五周总结

Melo

极客大学架构师训练营

如果是你,年薪80万和阿里P7月薪36K,会怎么选?

犬来八荒

Java 腾讯 面试 阿里

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