Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface FRP应如何在顶层工作?_User Interface_Scala_Programming Languages_Functional Programming_Frp - Fatal编程技术网

User interface FRP应如何在顶层工作?

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,我想这样做:

 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,感觉我可能朝着正确的方向走,但在什么地方迷路了

编辑:如果没有人有明确的解决方案,那么想法/想法将是伟大的

有两件事:

  • 在科纳尔·埃利奥特(Conal Elliott)最初的设想中,行为在时间上是连续的,因此它们没有一个函数
    变化
    来指示它们何时变化

    返回当前时钟时间的行为是连续行为的主要示例。它不支持
    changes
    函数,除非您指定一个时间步长(“它每纳秒生成一个'change'事件”)。但“连续”的关键在于缺少时间步长

    在我看来,这意味着Conal意义上的行为根本不支持增量更新。在我的库中,我引入了一种新的数据类型
    Discrete
    ,它是行为和事件之间的某种混合。有关基本原理的更多详细信息,请参阅模块文档

  • 您可能对包装每个GUI函数(如
    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
    )。我想这取决于你和你的品味。