Haskell 实现了哪些事件驱动应用程序?

16

最近我一直在研究Haskell,它似乎是以一种与我平常所用的命令式编程(我有很强的C++背景)不同的方式来解决编程问题的好方法。

然而,我看到的所有文章似乎都处理着相同类型的编程问题:

  • 解析器
  • 编译器
  • 数值计算问题

我想尝试使用Haskell编写一些GUI应用程序。因此,我想知道:在函数式编程语言Haskell中编写事件驱动系统(如GUI)是否有意义?或者这是命令式语言擅长的问题领域?不幸的是,将我的思维转换为“函数式”模式仍需要花费相当长的时间,因此我很难判断使用函数式编程语言来构建事件驱动系统的利弊。

我也对用Haskell实现的GUI应用程序(或事件驱动系统)的示例感兴趣。


Gtk2hs是Haskell的Gtk绑定。 - Hai
13
先生,您太客气了:其他人总是问Haskell是否可以在“实际世界”中使用(无论那是什么),从而暗示Haskell程序员不是“真正的程序员”(无论意味着什么)。如果您实际上使用那些关键词而不是“事件驱动”,您实际上会在StackOverflow上找到相当丰富的问题和答案。 - Jörg W Mittag
例如: http://StackOverflow.Com/questions/1113226/ - Jörg W Mittag
这个问题最终的结论是什么?愿意分享一下你的经验吗? :) - mihai
6个回答

15

以下是关于IT技术的一些谷歌搜索关键词:

  • 函数响应式编程(FRP),一种用纯函数语言进行反应式(也称事件驱动)编程的编程范例。
  • Leksah,一个用Haskell语言编写的Haskell IDE。
  • Yi,一款类似Emacs的编辑器,将Lisp替换为Haskell作为实现、配置、定制和脚本语言。
  • 超级Monao兄弟(没错,你猜对了,这是一款跳跃和奔跑的游戏)
  • Frag(第一人称射击游戏)
  • 完全功能的复古游戏是一系列关于如何使用纯函数语言编写游戏的博客文章,以吃豆人作为例子进行解释。(第2部分第3部分第4部分。)

1
非常棒的链接收藏!特别是最后一个链接非常有趣。非常感谢! - Frerich Raabe

5

xmonad 是一个用 Haskell 编写的 X11 窗口管理器。

此外,查看不同的Haskell GUI 库的实现方式可能有助于了解如何在 Haskell 中制作交互程序的想法。


是的,我已经看过了Haskell GUI库,但是我有一种奇怪的感觉,它们只是绑定到使用“命令式”思维方式设计的API上。我怀疑具有“函数式”思维方式的程序员可能会对同样的问题采取不同的方法。 - Frerich Raabe
1
FG是一种基于箭头的高级函数式方法,用于可组合GUI。FranTk使用Conal Elliott的功能反应动画中的行为和事件概念。Grapefruit是一个基于箭头的声明性库。小部件、窗口和控制组件通过离散和连续信号进行通信。这些描述不仅仅是绑定的描述。 - Justin Smith

4

不错!这是一个很好的小例子 - 而且它可能是由一些有经验的 Haskell 编写的。因此,我在那里养成坏习惯的机会并不像其他地方那么高。;-) - Frerich Raabe

3
请查看这篇维基百科文章,它是一个基本的wxHaskell教程。特别是要看事件部分
我建议在开始开发完整应用程序之前,花些时间学习Haskell和FP,以便更加熟悉Haskell,因为它与C++有很大不同。

你说得没错,熟悉Haskell确实需要一些时间。然而,我注意到如果你之前已经使用过C++中的模板元编程,那么它并不是那么困难。模板元编程也非常声明式,你会习惯于执行迭代等操作而不使用状态(而是使用递归)。 - Frerich Raabe

3

xmonad是事件驱动的 -- 请参阅主事件处理循环,该循环从X服务器接收消息,并分派到纯函数代码,然后将状态呈现到屏幕上。


3
“函数响应式编程”已被提及,但如果您第一次接触它,可能会感到很复杂(即使您看的是一些高级文章,无论您学习了多长时间,它都会看起来很复杂:-))。然而,有一些非常好的文章可以帮助您理解它:
  • 组合反应式动画由Conal Elliott展示了一种“组合器库”(函数式语言中的常见编程风格),用于描述动画。它从非常简单的例子开始,但在第二部分中还展示了更有趣的“反应”部分。

  • Yampa Arcade是一个更进化的Functional Reactive Programming演示。它使用了一些高级的Haskell特性(例如箭头),但仍然非常易读。将其实际运行起来可能更加复杂,但它是一篇优秀的阅读材料。

  • Haskell表达学校由Paul Hudak撰写,使用多媒体和图形(包括一些动画等)来教授Haskell。这是一篇优秀的阅读材料,但由于它是一本完整的书籍,所以需要更多的时间 :-)。

我通过使用F#找到了函数式编程的方法,与Haskell相比它稍微不那么"纯",但是可以完全访问.NET库,所以很容易在函数语言中使用"真实世界"技术。如果你有兴趣,我的博客上有几个例子

哦,非常好!感谢您提供这些链接!还要感谢您指出F#是函数式的,并允许访问.NET库! - Frerich Raabe

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