现实世界的 Haskell 编程

50

我已经是一名命令式开发者好几年了,但从未有过学习函数式编程的冲动。

几个月前,我最终决定学习Haskell。这是一种很酷的语言,但我对如何在这样的语言中编写事件驱动的真实应用程序感到困惑。你知道有关此类主题的好教程吗?

注意:当我说“真实应用程序”时,并不是指一个实际的、生产就绪的应用程序。我只是想要一个小的示例应用程序,以便更好地理解它。我认为类似于简化版的Windows计算器会很棒,然后再尝试编写一些更复杂的内容。


“事件驱动”不是应用程序所做的事情的特征,而是它所实现的方式——在不将整个业务逻辑编码为“事件驱动”代码的情况下,可以完全实现相同的结果、业务需求和性能。某些东西是事件驱动的,是一种实现层面,而不是领域逻辑方面的东西。 - Erik Kaplun
7个回答

91

当你说“实际应用”时,你可能想到的是那些本质上是顺序的、状态相关的或需要大量I/O操作的问题,对吗?

那么,游戏怎么样呢?

那么,您想尝试一下 X 窗口管理器、可扩展的 Emacs 克隆文本编辑器或者是一个IDE呢?

此外,还有这本书,它的标题中已经包含了您的问题:Real World Haskell,而且这本书可以免费获取!

另外一个您可能会感兴趣的东西是 函数响应式编程。(例如,在 Frag 中使用了它。)FRP 的有趣之处在于,它允许您从完全不同的角度来看待诸如 GUI 编程之类的问题。如果您阅读 RWH 书中的 GUI 章节,您会发现它讲述的是如何像在 C 中编写 GUI 应用程序一样编写,只不过更好。而 FRP 则允许您以一种完全不同的方式来编写,这在 C 中甚至都不可能。

很多时候(我并不是说您的问题就是这种情况,但这是一个经常出现的模式),当有人说“但是 Haskell 能在实际中使用吗”时,他们实际上想表达的是“我知道如何在 C 中做到这一点,在 Haskell 中我无法以完全相同的方式做到,因此在 Haskell 中必定不可能完成,因此 Haskell 还没有准备好进入实际应用领域”。但他们忽略了这样一点,即可能有一种完全不同而且更好的解决问题的方法。(这就像说“Erlang 没有线程,因此它不可能用于实现并发系统。”)而 FRP 就是其中的一个例子。


2
确实,我自己也考虑过游戏(我曾经读过一篇来自某所大学的论文,提出使用简单的游戏来教授学生真实世界的Haskell,但是它没有太多信息)。我已经知道我不能像在C中那样做事情,我也知道这些事情可以用Haskell完成(只是用另一种方式),但是我不知道该怎么做。这主要是我的答案原因。非常感谢你们所有人,你们真的很有帮助。 - raven
1
但请注意还有一篇“重访‘纯函数式复古游戏’”的文章 http://prog21.dadgum.com/37.html - LennyStackOverflow
我想补充一点,XMonad实际上不是一个好的例子。如果你将它与使用lua的Awesome WM进行比较,你会发现XMonad多么冗长和不舒适。我听说这是由于核心设计不佳所致,所谓的StackSet。 - Hi-Angel

8
今天我为了一场闪电演讲收集了这个展示Haskell应用程序的列表,特意排除了只针对程序员的任何内容:

闪电演讲

  • darcs (自2002年以来,35,000行代码):分布式版本控制系统,注重变更而非状态的创新。
  • xmonad (自2007年以来,30,000行代码):著名的平铺窗口管理器,拥有大量的布局和其他插件库。尽管其配置文件是一个Haskell文件,但仍然被列入了名单。
  • hledger (自2007年以来,9,000行代码):基于文本文件的双账簿会计工具,是ledger的克隆版。
  • Raincat (自2008年以来,2,000行代码):一款平台游戏,玩家扮演一只不想淋湿的猫。
  • arbtt (自2009年以来,2,000行代码):我的自动基于规则的时间跟踪器。作为一个无耻的广告宣传进入了这个列表,可能并不那么受欢迎。现在它有了一个由Waldir Pimenta贡献的适当的网页。
  • detexify (自2010年以来,500行代码):非常有用的LaTeX字符命令查找器的后端是用Haskell编写的。
  • git-annex (自2010年以来,28,000行代码):管理您的文件及其位置,是dropbox和git的混合体。由著名的Joey Hess编写,他通过kickstarter从中谋生。他目前正在进行第二轮资金筹集
  • Nikki and the Robots (自2010年以来,18,000行代码):与Nikki和他的机器人一起玩的平台游戏。作为商业独立游戏制作并通过pay-what-you-like方案出售,但公司不幸倒闭了。
  • hoodle (自2011年以来,13,000行代码):一个类似于xournal的笔记和PDF注释软件。
  • Chordify (自2012年以来,?行代码):分析音乐(例如来自YouTube视频)并计算相应的吉他和弦。是闭源软件,但据说是用Haskell编写的。

(还在我的博客上特别介绍,并且在演讲幻灯片中以每个程序的美观代表图片呈现。)


7
xmonad是基于事件驱动的。它有一个监听器循环,在事件上唤醒,修改内部状态对X服务器进行建模,然后呈现到屏幕上。 http://xmonad.org

6

看起来这是一个很好且简单的开始。谢谢! - raven

6

我已经读了 LYAHFGG 的很大一部分。它非常好,也非常有趣,但我仍然没有找到任何关于固有顺序问题的内容。也许我必须继续阅读。 - raven

4

你应该看一下《实用 Haskell》。这本书免费提供,展示了如何将 Haskell 应用于实际问题。虽然不是教程,但内容更加全面。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接