8

GLFWとOpenGLの上にGUIを書くためのライブラリを探しています。これを行うのは、必須であると感じる一般的なUIライブラリバインディングに不満があるためです。また、UIのルックアンドフィールを厳密に制御したいと考えています。UIを定義するための宣言型アプローチが欲しいのですが。私はreactive-banana(および一時的にreactive-banana-wx)を試し、それが私のニーズを満たしているかどうかを確認しています。再帰ウィジェットの定義に問題があります。これが私の最も単純なテストケースです:

  • カウンターを表示するテキストウィジェット。
  • カウンターをインクリメントするボタンウィジェット。
  • カウンターが0の場合は非アクティブ(つまり、グレー表示され、入力にまったく応答しない)のボタンウィジェット。それ以外の場合はアクティブで、カウンターを0にリセットします。

1番目と3番目のウィジェットには再帰的な関係があります。最初のウィジェットは、2つのボタンからフィードされた一連のイベントstepperの直感的なものです。unionただし、リセットボタンはfmapカウンターの1つであり、イベントストリームはリセットボタンに依存しています。やるべきこと?

この質問以外に、イベント処理について懸念があります。フレームワークに依存するのではなく、コード内でデバイス入力と入力フォーカスを処理したいので、スケーラブルな方法でイベントを正しくディスパッチするのは難しいと思います。理想的にはdata、ウィジェットの階層構造をカプセル化するを定義し、要素間にイベントコールバックをインストールする方法を定義し、デバイスの入力処理とグラフィカル出力を定義するためにそのデータ構造をトラバースする関数を記述します。イベントストリームをマージするのと同じくらい簡単にイベントストリームを取得して分割する方法がわかりません。

4

1 に答える 1

5

Behavioraとaの間の相互再帰である限り、再帰は許可されEventます。sの良いところBehaviorは、更新時にそれらをサンプリングすると古い値が返されることです。

たとえば、あなたの例は次のように表すことができます

eClick1, eClick2 :: Event t ()

bCounter :: Behavior t Int
bCounter = accumB 0 $ mconcat [eIncrement, eReset]

eIncrement = (+1)      <$ eClick1
eReset     = (const 0) <$ whenE ((> 0) <$> bCounter) eClick2

「リアクティブバナナはネットワーク内のサイクルを処理できますか?」という質問も参照してください。


filterE2番目の質問については、関数とそのいとこfilterApplyを探しているようwhenEです。


全体的な目標としては、かなり野心的だと思います。私がこれまでに得た経験はほとんどないので、既存のフレームワークへのバインドは、FRPで「クリーンステート」フレームワークを作成することとはまったく異なるように感じます。おそらく、そこにはまだ発見されていない(しかしエキサイティングな!)抽象化が潜んでいます。私はかつて、時間とともに変化する描画についての優れた抽象化を含むBlackBoardというアプリケーションを書き始めました。

ただし、冒険よりも結果を重視する場合は、保守的なアプローチをお勧めします。命令型のGUIツールキットを作成し、その上にリアクティブバナナをフックして、FRPのメリットを享受します。

GUIが必要な場合は、現在、GUIとしてWebブラウザーに焦点を当てています。ここにJiを使ったいくつかの予備実験があります。wxHaskellに勝る主な利点は、起動と実行がはるかに簡単であり、API設計の取り組みが非常に幅広い対象者に役立つことです。

于 2012-11-04T11:33:07.310 に答える