【问题标题】:Which event-driven applications are implemented in Haskell?Haskell 中实现了哪些事件驱动的应用程序?
【发布时间】:2010-01-17 23:50:52
【问题描述】:

我最近一直在研究 Haskell,它似乎是从另一个角度观察编程问题的一种非常好的方法 - 至少可以替代我通常的命令式(我有很强的 C++ 背景)视图。

但是,我看到的所有文章似乎都在处理相同类型的编程问题:

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

我想亲自尝试一下 Haskell,通过编写一些 GUI 应用程序。因此,我想知道:用像 Haskell 这样的函数式编程语言编写像 GUI 这样的事件驱动系统有意义吗?或者这是命令式语言擅长的问题领域?不幸的是,我仍然需要相当长的时间才能将我的想法切换到“函数式”模式,所以我很难决定反对或支持将函数式编程语言用于事件驱动系统。

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

【问题讨论】:

  • Gtk2hs 是 Haskell 的 Gtk 绑定。
  • 先生,您太客气了:其他人总是问 Haskell 是否可以在“现实世界”(无论是什么)中使用,从而暗示 Haskell 程序员不是“真正的程序员” (无论那个是什么意思)。如果你真的使用 那些 关键字而不是“事件驱动”,你实际上会在 StackOverflow 上找到相当丰富的问题​​和答案。
  • 这个结论是什么?愿意分享经验吗? :)

标签: user-interface events haskell functional-programming event-handling


【解决方案1】:

这里有几个 Google 关键字供您参考:

  • Functional Reactive Programming (FRP),一种编程范式,用于以纯函数式语言进行良好的反应式(也称为事件驱动)编程,
  • Leksah,用 Haskell 编写的 Haskell IDE,
  • Yi,一个类似 Emacs 的编辑器,它用 Haskell 代替 Lisp 作为实现、配置、定制和脚本语言,
  • Super Monao Bros.(是的,你猜对了,一个 Jump&Run 游戏)
  • Frag(第一人称射击游戏)
  • Purely Functional Retrogames 是一个由 4 部分组成的系列博客文章,介绍如何用纯函数式语言编写游戏,以 Pacman 为例进行说明。 (Part 2Part 3Part 4。)

【讨论】:

  • 优秀的链接收藏!尤其是最后一个非常有趣。非常感谢!
【解决方案2】:

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

此外,看看各种Haskell GUI Libraries 是如何实现的,可能会提供一些关于如何在 Haskell 中制作交互式程序的想法。

【讨论】:

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

这是一个使用 epoll 实现事件驱动的 Web 服务器的示例:http://haskell.org/haskellwiki/Simple_Servers

【讨论】:

  • 整洁!这是一个很好的小例子——它可能也是由一些有经验的 Haskell 编写的。所以我在那里养成坏习惯的机会没有其他地方那么高。 ;-)
【解决方案4】:

看看this wikibooks article,这是一个基本的wxHaskell 教程。具体见Events section

我建议在开始开发成熟的应用程序之前花一些时间在 Haskell 和 FP 上,这样您就可以更熟悉 Haskell,因为它与 C++ 完全不同

【讨论】:

  • 你说得对,熟悉 Haskell 需要一些时间。但是,我注意到如果您以前在 C++ 中使用过模板元编程,这并不难。模板元编程也是非常声明性的,你习惯于在不使用状态(但递归)的情况下执行迭代等。
【解决方案5】:

xmonad 是事件驱动的——参见主事件处理循环,它从 X 服务器获取消息,并分派到纯功能代码,然后将状态呈现到屏幕上。

【讨论】:

    【解决方案6】:

    “函数式反应式编程”已经提到过,但是如果你是第一次看它,它可能看起来很复杂(如果你正在看一些高级文章,不管你看了多久,它都会看起来很复杂研究了它:-))。但是,有一些非常好的文章可以帮助您理解它:

    • Composing Reactive Animations by Conal Elliott 展示了一个用于描述动画的“组合库”(函数式语言中的一种常见编程风格)。它从非常简单的示例开始,但在第二部分也显示了更有趣的“反应性”部分。

    • Yampa Arcade 是功能响应式编程的更高级演示。它使用了一些高级的 Haskell 特性(例如 Arrows),但仍然非常易读。让它实际运行可能会更复杂,但它是一本极好的阅读材料。

    • Haskell School of Expression Paul Hudak 是一本教授 Haskell 使用多媒体和图形(包括一些动画等)的书。这是一本极好的读物,但它需要更多时间,因为它是一本书:-)。

    我找到了通过 F# 进行函数式编程的方法,与 Haskell 相比,它有点“纯粹”,但它让您可以完全访问 .NET 库,因此很容易使用来自“真实世界”的技术一种功能语言。如果您有兴趣,my blog 上有几个示例。

    【讨论】:

    • 哦,非常好!感谢这些链接!另外,感谢您指出 F# 是功能性的并允许访问 .NET 库!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2014-09-27
    • 2016-10-14
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多