English 中文(简体)
Using MonadPlus in FRP.Reactive.FieldTrip
原标题:

I m studying FRP at this moment through FieldTrip adaptor. And hit the problem with strange way of frames scheduling and integration. So now I m trying to build own marker Event for aligning Behaviour stepping.

So...

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)

Questions is:

  • Why this example leads to memory leak?
  • Is there safe way to build sequence of events where each next one is scheduled depending on previous?
  • 最佳回答

    It looks like joining events in this manner isn t going to work. Try this instead:

    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)
    

    Unfortunately there s still a space leak in this version, but it s much smaller. After running for about a minute the total RAM usage was about 9.7MB.

    There s also a flipFlop function that creates a Behavior Bool. This worked well for the flip-flop, but I didn t see a clean way to add "none" for the first two seconds.

    I also tried this

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

    which appears to work identically to the first version.

    Of course, this doesn t do much for dynamically scheduling in the manner your asking about. Unfortunately I don t believe this use-case works in Reactive.

    I very much admire the work that s produced Reactive, and I want to like it, but it seems to be extremely tricky to reason about. This thread from the mailing list is an example of the sort of problem (and solution!) that seems to be common. Also the "unamb" library (which underlies much of Reactive) exposed a number of very subtle bugs in GHC s threading that played havoc with results until they were fixed around ghc-6.12. Although that is not in any way the fault of Conal or other Reactive contributors, it made it that much harder to use the framework, particularly with earlier GHC s.

    You might try some of the other FRP packages. Yampa has a sound implementation, and I ve heard that Elerea is relatively simple to pick up, and it has a nice demo application.

    问题回答

    暂无回答




    相关问题
    Euler Problem in Haskell -- Can Someone Spot My Error

    I m trying my hand at Euler Problem 4 in Haskell. It asks for that largest palindrome formed by multiplying two three-digit numbers. The problem was simple enough, and I thought my Haskell-fu was up ...

    How does foldr work?

    Can anybody explain how does foldr work? Take these examples: Prelude> foldr (-) 54 [10, 11] 53 Prelude> foldr (x y -> (x+y)/2) 54 [12, 4, 10, 6] 12.0 I am confused about these executions....

    Efficient queue in Haskell

    How can I efficiently implement a list data structure where I can have 2 views to the head and end of the list, that always point to a head a tail of a list without expensive calls to reverse. i.e: ...

    Problem detecting cyclic numbers in Haskell

    I am doing problem 61 at project Euler and came up with the following code (to test the case they give): p3 n = n*(n+1) `div` 2 p4 n = n*n p5 n = n*(3*n -1) `div` 2 p6 n = n*(2*n -1) p7 n = n*(5*n -3)...

    Ways to get the middle of a list in Haskell?

    I ve just started learning about Functional Programming, using Haskel. I m slowly getting through Erik Meijer s lectures on Channel 9 (I ve watched the first 4 so far) and in the 4th video Erik ...

    haskell grouping problem

    group :: Ord a => [(a, [b])] -> [(a, [b])] I want to look up all pairs that have the same fst, and merge them, by appending all the list of bs together where they have the same a and discarding ...

    Closest equivalent to subprocess.communicate in Haskell

    I want to do a popen() / python s subprocess.communicate from Haskell - start a program, give it stdin, and get its stdout/stderr. What s the most direct / Haskellish way to do this?

    热门标签