2

現在、FieldTrip アダプターを通して FRP の勉強をしています。そして、フレームのスケジューリングと統合の奇妙な方法で問題にぶつかります。だから今、私は振る舞いのステップを揃えるために独自のマーカーイベントを構築しようとしています。

そう...

flipflop :: Behavior String
flipflop = stepper "none" (xflip 2) where
    xflip t0 = do
        t <- withTimeE_ (atTime t0)
        return "flip" `mplus` xflop (t+3)
    xflop t0 = do
        t <- withTimeE_ (atTime t0)
        return "flop" `mplus` xflip (t+2)
txtGeom = ((uscale2 (0.5::Float) *%) . utext . show <$>)
main = anim2 (txtGeom . pure flipflop)

質問は次のとおりです。

  • この例がメモリ リークを引き起こすのはなぜですか?
  • 前のイベントに応じて次のイベントがスケジュールされている一連のイベントを作成する安全な方法はありますか?
  • 4

    1 に答える 1

    1

    この方法でのイベントへの参加はうまくいかないようです。代わりにこれを試してください:

    import FRP.Reactive
    import FRP.Reactive.FieldTrip
    import Graphics.FieldTrip
    import Control.Monad
    import Control.Applicative
    
    
    flipflop = stepper "none" $ either (const "flip") (const "flop")
                <$> eitherE (atTimes ((+2) <$> [0,5..])) (atTimes [5,10..])
    
    txtGeom = ((uscale2 (0.5::Float) *%) . utext . show <$>)
    main = anim2 (txtGeom . pure flipflop)
    

    残念ながら、このバージョンにはまだスペース リークがありますが、はるかに小さくなっています。約 1 分間実行した後、RAM の合計使用量は約 9.7MB でした。

    flipFlopを作成する関数もありますBehavior Bool。これはフリップフロップではうまくいきましたが、最初の 2 秒間は「なし」を追加するきれいな方法がわかりませんでした。

    私もこれを試しました

    flipflop = stepper "none" $ (const "flip" <$> (atTimes ((+2) <$> [0,5..])))
                                `mplus` (const "flop" <$> atTimes [5,10..])
    

    最初のバージョンと同じように動作するようです。

    もちろん、これはあなたが求めている方法で動的にスケジューリングすることにはあまり役に立ちません。残念ながら、このユースケースが Reactive で機能するとは思えません。

    私は、Reactive で作成された作品を非常に高く評価しており、好きになりたいと思っていますが、理由を説明するのは非常に難しいようです。 メーリング リストのこのスレッドは、よくあると思われる問題 (および解決策!) の例です。また、「unamb」ライブラリ (Reactive の多くの基礎となるもの) は、GHC のスレッド化に多数の非常に微妙なバグを公開し、ghc-6.12 で修正されるまで、結果に大混乱をもたらしました。これは決して Conal や他の Reactive コントリビューターのせいではありませんが、特に以前の GHC では、フレームワークを使用するのが非常に難しくなりました。

    他の FRP パッケージのいくつかを試すことができます。Yampa はしっかりとした実装があり、 Elereaは比較的簡単に手に入れることができ、素晴らしいデモ アプリケーションがあると聞いています。

    于 2011-01-08T04:47:31.780 に答える