باستخدام monadplus في FRP.Reactive.FieldTrip
-
24-09-2019 - |
سؤال
أنا أدرس 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 لديها تطبيق سليم ، وسمعت ذلك ايليا بسيط نسبيا للالتقاء ، وله لطيف التطبيق التجريبي.