Haskell FRP是实施most的正确方法吗;“事件驱动”;东西?

Haskell FRP是实施most的正确方法吗;“事件驱动”;东西?,haskell,event-handling,frp,Haskell,Event Handling,Frp,在我对Haskell的第一印象中,它是一种能够处理“执行然后结果”事情的语言,令人惊讶地好。但我找不到如何实现“事件驱动”的东西,比如游戏或HTTP/FTP/TCPSocket服务器 这个问题在我读了一些关于FRP的文章后得到了回答,包括Yampa和它创建的FPS游戏()。FRP似乎是一个很好的模型,可以实现“重”事件驱动的东西,如3D游戏,但对于HTTP服务器或普通桌面GUI程序等较轻的事件驱动应用程序又如何呢?如果我使用FRP来实现所有这些事情,会出现什么缺点?FRP是一种非常通用的技术,几

在我对Haskell的第一印象中,它是一种能够处理“执行然后结果”事情的语言,令人惊讶地好。但我找不到如何实现“事件驱动”的东西,比如游戏或HTTP/FTP/TCPSocket服务器


这个问题在我读了一些关于FRP的文章后得到了回答,包括Yampa和它创建的FPS游戏()。FRP似乎是一个很好的模型,可以实现“重”事件驱动的东西,如3D游戏,但对于HTTP服务器或普通桌面GUI程序等较轻的事件驱动应用程序又如何呢?如果我使用FRP来实现所有这些事情,会出现什么缺点?

FRP是一种非常通用的技术,几乎可以肯定地用于实现通常使用事件的任何东西。在FRP的经典演绎中,事件是核心抽象之一。不同之处在于,不是通过回调单独操作事件,而是操作事件流

您应该能够根据事件流呈现任何正常的事件驱动代码;唯一的困难是将流与现有的外部代码(如GUI工具包)绑定;然而,这与其说是棘手,不如说是乏味。因此,我不认为有任何根本性的问题会阻止您在任何您将使用不同语言的事件的地方使用FRP

事实上,我有一些很好的经验,将FRP用于您所谓的“打火机”:简单的GUI程序。我使用wxWidgets编写了一些非常简单的小图形程序。我发现生成的代码比等效的基于回调的代码更简单、更易于编写和阅读

活性香蕉也可以用于类似的事情,所以它显然是广泛适用的。除了GUI编程之外,我什么都没试过,但其他人也尝试过,所以这是可能的

此外,您应该查看Elm,它是一种ML风格的语言,用于使用FRP实现web应用程序。它生成您需要的所有内容:HTML、CSS和JavaScript。我相信它甚至可以处理与服务器的通信。我没试过,但看起来很不错

因此,人们显然在很多领域使用FRP,包括那些不“重”的领域。但这并不意味着你应该在任何地方使用它

首先,有可能获得不可预测的空间和时间行为。我知道,反应型香蕉和榆树的创造者在减少这些方面付出了很多努力,但我怀疑仍然存在一些风险。我知道我在玩反应型香蕉WX时有一些非常奇怪的空间泄漏,所以这肯定是需要注意的。使用FRP处理这些问题可能比使用您习惯使用的事件驱动代码更难。当然,我在使用标准JavaScript时遇到了无法解释的内存泄漏,所以非FRP代码也不能幸免

另一个考虑因素是,FRP可能不是您特定任务的最佳或最清晰的抽象。虽然它对于必须完全反应的事情来说是很好的,但是对于非常简单的代码(比如web服务器)呢?(我的意思很简单,因为在不同的请求中,它们之间的交互可能不会太紧密。)我想象,使用基于FRP的编程模型处理大量请求的web框架是可能的;我只是不认为这是最好的


事实上,我的理解是,GHC IO系统实际上已经是事件驱动的,因此您可以以标准编程风格编写web服务器,并免费获得使用事件的好处。因此,对于web服务器代码,更简单的底层抽象可能是更好的选择。我相信现有的Snap和Yesod框架就是这样做的——它们都不使用反应式编程风格,但都很好用。

除了“简单的”Haskell之外,您不需要使用任何东西来实现事件驱动的游戏。我目前正在使用Haskell编写一个具有以下(非常高级)“体系结构”的FPS:


它工作得很好。不需要镜片、玻璃钢或其他“异国情调”的东西。

谢谢!我将尝试你提到的那些项目,看看如何开发玻璃钢应用。作为《反应香蕉》的作者,我当然会对任何关于神秘空间泄漏的报道感兴趣。:)哦,是的,这是一个很棒的图书馆。我会准备一份bug报告。我只是怀疑这对我来说很神秘,因为我没有经验。Haskell FRP库是否能很好地处理异步和需要并行运行的代码?我们能否以并发方式发送事件?
uiMake :: IO ([UIEvent],UIState)
uiTick :: UIState -> [ApEvent] -> IO ([UIEvent],UIState)

apMake :: ([ApEvent],ApState)
apTick :: ApState -> [UIEvent] -> ([ApEvent],ApState)

-- UIState = The state of the UI
-- ApState = The state of the application (game)
-- UIEvent = Key presses, screen resolution changes etc.
-- ApEvent = Entity movements etc.