我一直在尝试创建一个Functional Reactive Programming framework for Scala。目前我感到困惑的一件事是,当前的实现是如何处理在顶级表示行为的。为了解释我的意思,我将举一个例子。假设我有一个JPanel,我想这样做:
JPanel panel = new Panel()
panel.setBackground(new Behaviour(time => Color.red))虽然这里的颜色是静态的,但我们希望面板背景在Behaviour的值更新时更新。到目前为止,我所采用的方法基本上是使用事件创建一个离散化的行为(可通过行为上的changes函数访问)。这基本上只是一个事件源,只要行为发生变化就会发生。使用这种方法,这里的setBackground实现将是:
def setBackground(color : Behaviour[Color]) {
super.setBackground(color.now)
color.changes.each(change => super.setBackground(change))
}这感觉有点乱。有没有人对这是不是一个糟糕的方法有什么建议?我今天一直在看埃利奥特的Push-Pull FRP,感觉我可能走对了方向,但在某个地方迷路了。
编辑:如果没有人有明确明确的解决方案,那么想法/想法就很棒了!
发布于 2011-10-15 15:48:29
两件事:
changes。返回当前时钟时间的行为将是连续行为的主要示例。它不支持changes函数,除非你指定一个时间步长(“它每纳秒生成一个'change‘事件”)。但“连续”的要点是缺少时间步长。
在我看来,这意味着Conal意义上的行为根本不支持增量更新。在我的reactive-banana库中,我引入了一种新的数据类型Discrete,它是行为和事件的某种混合。
setBackground这样的每个图形用户界面函数进行包装,使其与行为而不是普通的值一起工作,这可能会让你感到恼火。这是高阶函数真正的亮点:包装器总是相同的,你可以将其表示为高阶函数;这里是Haskell版本:set‘::property a -> Behavior a -> IO () set’Property behavior = do set property (now behavior) each (\a -> set property a) (更改行为) each f event = reactimate (fmap F event) -- helper定义示例= set‘背景红色
当然,这在很大程度上依赖于Haskell的语法,在Scala中可能不会那么令人愉快,因为在Scala中,一些函数是在第一个参数之前编写的。
https://stackoverflow.com/questions/7771044
复制相似问题