User interface FRP应如何在顶层工作?
我一直在尝试创建一个。目前我感到困惑的一件事是,当前的实现如何处理顶级行为的表示。为了解释我的意思,我举个例子。假设我有一个JPanel,我想这样做:User interface FRP应如何在顶层工作?,user-interface,scala,programming-languages,functional-programming,frp,User Interface,Scala,Programming Languages,Functional Programming,Frp,我一直在尝试创建一个。目前我感到困惑的一件事是,当前的实现如何处理顶级行为的表示。为了解释我的意思,我举个例子。假设我有一个JPanel,我想这样做: JPanel panel = new Panel() panel.setBackground(new Behaviour(time => Color.red)) 虽然这里的颜色是静态的,但我们希望面板背景在行为值更新时更新。到目前为止,我所采用的方法基本上是使用事件创建离散化行为(可通过行为上的changes函数访问)。这基本上只是行
JPanel panel = new Panel()
panel.setBackground(new Behaviour(time => Color.red))
虽然这里的颜色是静态的,但我们希望面板背景在行为值更新时更新。到目前为止,我所采用的方法基本上是使用事件创建离散化行为(可通过行为上的changes
函数访问)。这基本上只是行为改变时发生的事件源。利用这一点,这里的挫折实施将是:
def setBackground(color : Behaviour[Color]) {
super.setBackground(color.now)
color.changes.each(change => super.setBackground(change))
}
这感觉有点乱。有人对这是否是一种糟糕的方法有什么建议吗?我今天一直在看Elliott's,感觉我可能朝着正确的方向走,但在什么地方迷路了
编辑:如果没有人有明确的解决方案,那么想法/想法将是伟大的 有两件事:
变化
来指示它们何时变化
返回当前时钟时间的行为是连续行为的主要示例。它不支持changes
函数,除非您指定一个时间步长(“它每纳秒生成一个'change'事件”)。但“连续”的关键在于缺少时间步长
在我看来,这意味着Conal意义上的行为根本不支持增量更新。在我的库中,我引入了一种新的数据类型Discrete
,它是行为和事件之间的某种混合。有关基本原理的更多详细信息,请参阅模块文档setBackground
)而不是简单的值感到恼火。这是高阶函数真正的亮点:包装器总是一样的,你可以把它表达成高阶函数;这里是Haskell版本:
set' :: Property a -> Behavior a -> IO ()
set' property behavior = do
set property (now behavior)
each (\a -> set property a) (changes behavior)
each f event = reactimate (fmap f event) -- helper definition
example = set' background red
当然,这在很大程度上依赖于Haskell的语法,在Scala中可能没有那么令人愉快,因为有些函数是在第一个参数之前编写的我愿意为一个问题增加一些赏金,这个问题要求将论文翻译成Scala。@ziggystar我同意这将是令人惊讶的。研究FRP的一个主要问题是必须遍历不熟悉的Haskell语法。但是,要求堆栈上溢出是正确的吗?可能唯一反对的一点是,问题的范围应该合理。因此,答案不应该太长。但我认为这个问题本身是可以的。但在合理的水平上翻译论文需要一些时间。我更怀疑它是在博客上发布的。你可能会在这里得到答案:@Szabolcs问题在于Scala.react不是真正的FRP。不过还是要感谢你的链接。我曾经考虑过一个类似于
set
的函数,是的,它在Scala中不是很好(主要是因为background
属性和其他属性通常在类外不可用)。然而,看起来这是最好的方法。另外,我要确认我的实现中的行为实际上是连续的。changes
函数返回一个EventSource,该EventSource监听对行为的更改(它更像是一个实用工具,而不是任何东西)。这里的reactimate
函数是什么(并且changes
指的是我的changes
)?@Oetzi:返回当前时钟时间的行为是连续行为的主要示例。你不能为它编写一个changes
函数,因为它“一直”在变化。@Oetzi:reactimate
函数是你的函数的一部分;后者分解为fmap
和reactimate
部分。changes
函数应该是相同的。我知道changes
函数在技术上是不准确的。然而,我要问的是,你会如何表现这里的颜色行为。你会用离散型而不是行为型吗?@Oetzi:是的,我会用离散型。此外,还可以选择尝试以一种方式实现行为,即在内部使用更改
函数以提高效率,但不导出它;这将避免Discrete
类型不幸地重复功能。或者默认情况下,您可以将行为
离散化,但这会使语义变得复杂一些(不再连续行为a=Time->a
)。我想这取决于你和你的品味。