在这个帖子中,我将尽我所知地讲解 Haskell 生态系统的目前状态及其在不同的编程领域及编程任务中的适应性。这个帖子的目的在于对 Haskell 优秀的地方广而告之以讨论其优点,同时强调 Haskell 我认为还有可以提升空间的地方以讨论其不足。
这个帖子分成两部分:第一部分涵盖了 Haskell 在特殊的编程应用领域(也就是,服务器、游戏或者数据科学)的适用性;第二部分涵盖了 Haskell 在普通的通用目的编程领域需求方面(比方说测试、集成开发环境(IDEs)或者并发)的适用性。
主题贯穿了最为优秀的方面到最为不足的方面。每个编程的领域又被总结为以下几个级别的某一个单一的级别:
经典中最优秀的:在任何语言中都有最好的体验
成熟的:适合大多数编程人员
不成熟的:只被早期的用户所接受
差的:相当没用处
排名越正我将更加愿意用在自然环境下成功的事例加以支持。排名越负我将更加提供 一些 怎样提高自身的建设性意见。
负责声明#1 : 显然,我并不知道 Haskell 生态系统的所有的事情,因此,不管什么时候,为了能够征求那些有更加丰富经验的人的意见,我不能确保我作出的是一个在可变通范围内的猜想还是清晰地陈述我所不确定的东西。我将 Haskell 生态系统很好地进行标号,就这一点这个帖子仍然拓展了我的知识。如果你认为我的任何一个排名是错的,我会很高兴的接受正确的排名顺序(排名应该向上靠还是向下靠)
负责声明#2:在书籍非常缺乏的部分我们会有一些“教育资源”,因为我并不熟悉电子书相关的资源。如果你有一些电子书添加的建议,请让我们知道。
负责声明#3:如果你还没有从我的博客名字以及下面提及的几个库的作者的名字中发现我很明显是 Haskell 的狂热粉丝,因此我是相当偏心的。我已经作出了很大的努力在客观评价这个语言,但是如果你发现我的偏心蒙蔽了我,请向我的排名提出质疑!我还在扩展链接部分明确的将推销 Haskell 的言辞视作“广告宣传”。:)
应用领域
编译器
服务器端网络编程
脚本/命令行应用
数值编程
客户端网络编程
分布式编程
单机图形界面编程
机器学习
数据科学
游戏编程
系统/嵌入式编程
移动app
普通编程需求
重构
类型系统
特定领域语言(DSLs)
测试
并发
数据结构和算法
基准管理
统一码
语法清晰/代码整洁
流编程
序列化/并行化
支持文件格式
包管理
日志
数据库及数据存储
集成开发环境的支持
级别:经典中最好的
Haskell 是一种发开属于你自己的令人惊喜的语言。如果你准备用另外一种语言写个编译器,那么你应该真诚地考虑是不是换回来比较好。
Haskell 起源于学术界,很多起源于学术界的语言在编译器相关的开发任务中都表现地很优秀,理由也很明显。因此,这一语言拥有丰富的专注于编译器相关开发任务的系统库,比方语法分析,代码整洁,统一化,约束变量,语法树操作和优化。
那些未曾写过编译器的人都知道这实现起来有多难,因为需要操作非常弱类型数据(字符串和整型的树和图)。所以,从类型检查到优化再到代码生成,编译器所做的每一件事都很大程度上会产生错误。钽Haskell在这一点上表现的十分精彩,它有非常强的类型系统,这些类型系统有很多扩展能在编译时间内大量的错误。
我还认为对编译器开发人员来说,这里有很多优秀的教育资源,不管是文章还是书籍。我本人并不是总结所有教育资源的最为合适的人,但我却是那个读过高质量的资源的人。
最后,这里有很多会对其它语言的语法分析器和代码美化器,你可以使用这些工具来写出这些语言的编译器或者用这些语言来写编译器。
parsec attoparsec trifecta alex + happy -语法分析库
bound -操作约束变量
hoopl - 优化
wl-pprint ansi-wl-pprint -代码美化
llvm-general LLVM API
语言-{ javascript | python | c-quote | lua | java | objc } - 会对其它语言的语法分析器和代码美化器
Elm
Purescript
Idris
Agda
Pugs(Perl 6的第一版实现)
ghc(自托管)
frege(和Haskell很像也是自托管)
Write you a Haskell
A Tutorial Implementation of a Dependently Typed Lambda Calculus
评级:成熟
Haskell 第二强项就是后端编程,包括 web 应用程序和 web 服务。Haskell 语言的主要特性如下表:
服务稳定
高效
简单易用的并发编程
对 web 标准的良好支持
强类型系统和简练的运行时大大的提高了服务器的稳定性和易用性。这就是 Haskell 和其它后端语言的最大区别,因为它很大程度的减少了执行花销。与其它类型的语言,尤其是静态类型语言相比,维护基于 Haskell 语言编写的服务需要的程序员更少。
然而,服务器稳定最大的缺点是空间泄漏。我知道最为常见的解决方法是使用 ekg(一个进程监视器)在毁坏其结果之前检查服务器内存的稳定性。第二种解决方法是学会运用经验来检查和防止内存泄漏,这种方法并不像人们想的那样难。
Haskell 的表现是很优秀的可与当前的 java 相媲美。对于新手和老手来说这两种语言表现的都差不多,虽然理由不尽相同。
Haskell 在使用性方面优异之处在于它运行时支持下列特性:
轻量级线程加强(这 一点 Haskell 与 JVM 不同)
软件内存交互(这一点 Haskell 与 Go 不同)
垃圾回收(这一点 Haskell 与 Rust 不同)
很多语言支持上述特性的两种,但是据我所知,Haskell 是唯一一种上述三点特性全支持的语言。
如果你从没有用过 Haskell 软件交互内存,你真的真的应该尝试一下,因为它排除了大量并发逻辑缺陷。STM 是一个远远被低估了的 Haskell 运行时的特性。
warp / wai - 提供共享库的低级服务和 API,具备 snap 的异常机制
scotty- 和 Ruby 的 Sinatra 相似的对新手友好的服务器框架
yesod/ yesod-* / snap / snap-* - 具备所有附加修饰物的“企业级”服务框架
servant/ servant-* - 这是一种可能让你痴狂的服务框架
authenticate / authenticate-* - 共享认证库
ekg / ekg-* - Haskell 服务监视
stm -软件交互内存
Facebook 的垃圾邮件过滤器:Sigma
elm-lang.org
glot.io
The Perry Bible Fellowship
Silk
Shellcheck
instantwatcher.com
Fighting spam with Haskell - Haskell in production, at scale, at Facebook
Mio: A High-Performance Multicore IO Manager for GHC
The Performance of Open Source Applications - Warp
Optimising Garbage Collection Overhead in Sigma
instantwatcher.com 作者对以 Haskell 代替 Ruby 进行重写的评论
Making a Website With Haskell
Beautiful concurrency - 一个软件交互内存的教程
The Yesod book
The Servant tutorial
作为脚本语言 Haskell 最大的优势在于它是一种被广泛采取的支持全局类型推断的语言。很多语言都支持局部类型推断(比如 Rust,Go,Java,C#),这意味着函数的形参和接口一定要被声明而其它的东西都能被推断出来。在 Haskell 中你可以省略所有的东西:所有的类型和接口全部都可以由编译器推断出来(会有些警告但这是次要的)。
全局类型推断使得 Haskell 感觉是一种脚本语言但同时能够提供静态安全性的保证。脚本类型安全性对企业开发环境尤其重要,在这种环境下,运行时被提高了特权的粘合性脚本语言在这些软件架构中是最为弱的一点。