سؤال

أنا أدرس FRP في هذه اللحظة من خلال محول FieldTrip. وضرب المشكلة مع طريقة غريبة لجدولة الإطارات والتكامل. لذا ، أحاول الآن بناء حدث علامة خاص لمحاذاة خطوة السلوك.

لذا...

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)

الأسئلة هي:

  • لماذا يؤدي هذا المثال إلى تسرب الذاكرة؟
  • هل هناك طريقة آمنة لبناء تسلسل للأحداث حيث يتم جدولة كل واحدة التالية اعتمادًا على السابق؟
  • هل كانت مفيدة؟

    المحلول

    يبدو أن الانضمام إلى الأحداث بهذه الطريقة لن ينجح. جرب هذا بدلاً من ذلك:

    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)
    

    لسوء الحظ ، لا يزال هناك تسرب مساحة في هذا الإصدار ، لكنه أصغر بكثير. بعد الركض لمدة دقيقة تقريبًا ، كان استخدام إجمالي ذاكرة الوصول العشوائي حوالي 9.7 ميجابايت.

    هناك أيضا flipFlop الوظيفة التي تخلق أ Behavior Bool. لقد نجح هذا بشكل جيد بالنسبة لـ Flip-Flop ، لكنني لم أر طريقة نظيفة لإضافة "لا شيء" لأول ثانيتين.

    لقد جربت هذا أيضًا

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

    الذي يبدو أنه يعمل بشكل متماثل للإصدار الأول.

    بالطبع ، هذا لا يفعل الكثير للجدولة ديناميكيًا بالطريقة التي تسأل بها. لسوء الحظ ، لا أعتقد أن حالة الاستخدام هذه تعمل في التفاعل.

    أنا معجب بشدة بالعمل الذي ينتج عن التفاعل ، وأريد أن يعجبني ، لكن يبدو أنه من الصعب للغاية التفكير فيه. هذا الموضوع من القائمة البريدية مثال على نوع المشكلة (والحل!) يبدو أنه شائع. كما كشفت مكتبة "UNAMB" (التي تكمن وراء الكثير من التفاعل) عددًا من الأخطاء الدقيقة للغاية في خيوط GHC التي لعبت الفوضى مع النتائج حتى تم إصلاحها حول GHC-6.12. على الرغم من أن هذا ليس بأي حال من الأحوال خطأ في كونال أو غيرهم من المساهمين التفاعليين ، إلا أنه جعل من الصعب استخدام الإطار ، خاصة مع GHC السابقة.

    قد تجرب بعض حزم FRP الأخرى. Yampa لديها تطبيق سليم ، وسمعت ذلك ايليا بسيط نسبيا للالتقاء ، وله لطيف التطبيق التجريبي.

    مرخصة بموجب: CC-BY-SA مع الإسناد
    لا تنتمي إلى StackOverflow
    scroll top