14

私は現在、Heinrich Apfelmus の react -bananaを通じて FRP を知ろうとしています。これは、私が調べた他のライブラリと比較して、非常によく文書化されたシンプルなライブラリのようです。

ただし、AddHandler型について頭を悩ませることはできません。GLFWを使用してマウス ボタンのクリックを取得し、 のようなものにしたいとしましょうeMouseButton :: Event ()例を見ると、どうにかしてfromAddHandlerを使用する必要があるようですが、そのAddHandler引数を組み立てる方法がわかりません。newAddHandlerどうにか使い切らなければならないと思うのですが、いかがでしょうか?

reactive-banana以外の何かに接続する方法の例はwx、大いに役立つと思います。

4

1 に答える 1

14

newAddHandlerこのように使用されます:

do (addHandler, fire) <- newAddHandler
   ...

addHandlerはに渡すAddHandlerreactive-bananaであり、イベントをトリガーするタイプ(aはイベントタイプ)fireの関数です。a -> IO ()

たとえば、次fireのように、GLFWのマウスボタンイベントへのコールバックとしてインストールする可能性があります。

registerMouseButton :: IO (Event MouseButton)
registerMouseButton = do
  (addHandler, fire) <- newAddHandler
  setMouseButtonCallback $ \button _ -> fire button
  fromAddHandler addHandler

(私はGLFWの経験がないので、setMouseButtonCallbackコールバックの2番目の引数が何であるかわかりません。重要な場合は、この実装を適切に修正する必要があります。)

AnAddHandlerは、コールバックを受け取る関数です— a -> IO ()—そしてそれを問題のイベントに登録します。次に、このハンドラーの登録を解除するために使用されるアクションを(内部から)返し、読み取りの完全な定義を次のようにします。IOIO ()AddHandler

type AddHandler a = (a -> IO ()) -> IO (IO ())

では、どこからnewAddHandler来るのでしょうか?シンプル:newAddHandlerイベントのハンドラーのリストを維持し、fire x実行時にそれらをアクティブにします。

newAddHandlerGTK +や他の多くの一般的なツールキットのように、ツールキットに複数のイベントハンドラーを登録および登録解除する機能がすでにある場合は必要ありません。含まれている場合は、独自の実装を作成する必要がありますAddHandler。ただし、サポートするのが単一のコールバックだけの場合は、を使用する必要がありますnewAddHandler

AddHandlerをFRPに公開する必要はないことに注意してください-コード自体を使用します。Eventこれらは、外部入力からを作成するために使用される単なる内部接着剤です。

于 2011-12-25T22:14:29.297 に答える