首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FRP应该如何在顶层工作?

FRP应该如何在顶层工作?
EN

Stack Overflow用户
提问于 2011-10-15 01:02:16
回答 1查看 422关注 0票数 11

我一直在尝试创建一个Functional Reactive Programming framework for Scala。目前我感到困惑的一件事是,当前的实现是如何处理在顶级表示行为的。为了解释我的意思,我将举一个例子。假设我有一个JPanel,我想这样做:

代码语言:javascript
复制
 JPanel panel = new Panel()
 panel.setBackground(new Behaviour(time => Color.red))

虽然这里的颜色是静态的,但我们希望面板背景在Behaviour的值更新时更新。到目前为止,我所采用的方法基本上是使用事件创建一个离散化的行为(可通过行为上的changes函数访问)。这基本上只是一个事件源,只要行为发生变化就会发生。使用这种方法,这里的setBackground实现将是:

代码语言:javascript
复制
def setBackground(color : Behaviour[Color]) {
  super.setBackground(color.now)
  color.changes.each(change => super.setBackground(change))
}

这感觉有点乱。有没有人对这是不是一个糟糕的方法有什么建议?我今天一直在看埃利奥特的Push-Pull FRP,感觉我可能走对了方向,但在某个地方迷路了。

编辑:如果没有人有明确明确的解决方案,那么想法/想法就很棒了!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-15 15:48:29

两件事:

  1. 在Conal Elliott的原始愿景中,行为在时间上是连续的,所以当它们发生变化时,它们不会带有指示它们的函数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中,一些函数是在第一个参数之前编写的。

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

https://stackoverflow.com/questions/7771044

复制
相关文章

相似问题

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