16

Haskell に対する私の最初の印象では、「実行してから結果を出す」ということを驚くほどうまく処理できる言語です。しかし、ゲームや HTTP/FTP/TCPSocket サーバーなどの「イベント駆動型」のものを実装する方法が見つかりません。

この質問は、Yampa とそれによって作成された FPS ゲーム ( Frag ) を含む、FRP に関するいくつかの論文を読んだ後に回答が得られました。FRP は 3D ゲームのような「重い」イベント駆動型のものを実装するのに適したモデルのようですが、HTTP サーバーや通常のデスクトップ GUI プログラムのようなイベント駆動型の小さなアプリケーションはどうでしょうか? これらすべてを実装するために FRP を使用すると、どのような短所が現れますか?

4

2 に答える 2

17

FRP は非常に一般的な手法であり、通常はイベントを使用するあらゆるものを実装するためにほぼ確実に使用できます。FRP の古典的な表現では、中核となる抽象化の 1 つがイベントです。違いは、コールバックを使用して個別にイベントを操作するのではなく、イベントのストリームを操作することです。

イベントのストリームに関して、通常のイベント駆動型コードをレンダリングできる必要があります。唯一の問題は、ストリームを GUI ツールキットのような既存の外部コードにバインドすることです。ただし、これはトリッキーというより面倒です。したがって、別の言語でイベントを使用する場所で FRP を使用することを妨げる根本的な問題は見当たりません。

実際、私は FRP を使用して、いわゆる「軽い」もの、つまり単純な GUI プログラムに良い経験をしました。私はwxWidgets でリアクティブ バナナを使用して、非常に単純で小さなグラフィカル プログラムを作成しました。結果として得られるコードは、同等のコールバック ベースのコードよりもはるかに単純で、書きやすく、読みやすいことがわかりました。

Reactive Banana はmusicなどにも使用できるため、明らかに広く適用できます。私はそれを使った GUI プログラミング以外は何も試していませんが、他の人はそうしているはずです。

さらに、FRP を使用して Web アプリを実装するための ML スタイルの言語である Elm もチェックしてください。HTML、CSS 、 JavaScriptなど、必要なものがすべて生成されます。サーバーとの通信も処理していると思います。試したことはありませんが、とてもいい感じです。

つまり、「重い」ものではない分野も含め、さまざまな分野で FRP が使用されていることは明らかです。しかし、これはどこでも使用する必要があるという意味ではありません。

1 つには、予測不可能な空間と時間の動作が発生する可能性があります。Reactive Banana と Elm の両方の作成者がこれらを減らすために多大な努力を払っていることは知っていますが、まだリスクがあると思います. Reactive Banana WX で遊んでいるときに非常に奇妙なスペース リークが発生したことはわかっているので、注意が必要です。これらを FRP で処理するのは、使い慣れたイベント駆動型のコードよりも難しいかもしれません。もちろん、標準の JavaScript で不可解なメモリ リークが発生したことがあるので、FRP 以外のコードもこれに影響されません。

もう 1 つの考慮事項は、FRP が特定のタスクにとって最適または最も明確な抽象化ではない可能性があることです。完全に反応する必要があるものには最適ですが、Web サーバーのような非常に単純なコードはどうでしょうか? (異なるリクエストでは、おそらくお互いにあまり密接に相互作用しないので、単純という意味です。) FRP に基づくプログラミング モデルを使用して大量のリクエストを処理する Web フレームワークを持つことは可能であると思います。私はそれが最適だとは思わない。

実際、私の理解では、GHC IO システムは内部ですでにイベント駆動型になっているため、標準的なプログラミング スタイルで Web サーバーを記述し、イベントを無料で使用する利点を得ることができます。そのため、Web サーバー コードの場合は、基になる抽象化を単純化する方が適切な選択になる可能性があります。これは、Snap や Yesod などの既存のフレームワークが行っていることだと思います。どちらもリアクティブ プログラミング スタイルを使用していませんが、どちらも快適に使用できます。

于 2012-11-21T05:24:24.193 に答える
2

イベント駆動型ゲームを実装するために、「単純な」Haskell 以外のものを使用する必要はありません。私は現在、次の(非常に高レベルの)「アーキテクチャ」でHaskellを使用してFPSを作成しています。

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.

それはうまくいきます。レンズ、FRP、その他の「エキゾチック」なものは必要ありません。

于 2012-11-30T04:16:43.773 に答える