首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonadPlus在FRP.Reactive.FieldTrip中的应用

MonadPlus在FRP.Reactive.FieldTrip中的应用
EN

Stack Overflow用户
提问于 2010-04-03 17:25:25
回答 1查看 275关注 0票数 2

我现在正在通过FieldTrip适配器学习玻璃钢。并以奇怪的帧调度和集成的方式解决了问题。因此,现在我试图构建自己的标记事件来调整行为步进。

所以..。

代码语言:javascript
复制
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)

问题是:

  • 为什么这个例子会导致内存泄漏?
  • 是否有安全的方法来构建事件序列,根据以前的情况,每一个事件都被调度?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-08 04:47:31

看来以这种方式参加活动是行不通的。试一试:

代码语言:javascript
复制
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.7MB。

还有一个创建flipFlopBehavior Bool函数。这对触发器很有效,但我没有看到在前两秒中添加“无”的干净方法。

我也试过这个

代码语言:javascript
复制
flipflop = stepper "none" $ (const "flip" <$> (atTimes ((+2) <$> [0,5..])))
                            `mplus` (const "flop" <$> atTimes [5,10..])

它似乎与第一个版本的工作原理相同。

当然,这对于以您询问的方式进行动态调度并没有多大作用。不幸的是,我不相信这个用例在反应性中有效。

我非常欣赏那些产生反应的作品,我想要喜欢它,但它似乎是非常棘手的理由。邮件列表中的这个帖子就是这类问题的一个例子(以及解决方案!)这似乎很常见。此外,"unamb“库(它是许多反应性的基础)暴露了ghc线程中的一些非常微妙的bug,这些bug对结果起到了破坏作用,直到它们被修复在ghc-6.12周围。尽管这绝不是Conal或其他反应性贡献者的错,但它使得使用框架变得更加困难,特别是在早期的GHC中。

你可以试试其他的玻璃钢包装。Yampa有一个很好的实现,我听说埃雷亚相对简单,而且它有一个很好的演示应用程序

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2572036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档