Programming languages 是';信号';函数式反应式编程的表示是否正确?

Programming languages 是';信号';函数式反应式编程的表示是否正确?,programming-languages,functional-programming,reactive-programming,frp,Programming Languages,Functional Programming,Reactive Programming,Frp,我一直在研究FRP,发现了许多不同的实现。我看到的一个模型是我将称之为“信号”表示的模型。这一基本要素将事件和行为组合成一个实体 首先,信号是一个对象,其价值是一种行为。其次,信号有一个事件“流”,可以作为标准数据结构查看和操作(可以在信号上使用“每个”、“映射”和“过滤器”等来定义事件的反应方式)。例如,我可以这样做(其中“time”是时间的信号表示): FRP的表示是否正确,或者是否存在任何问题?我很喜欢这种工作方式,也很喜欢用个人的方式来描述它是多么简单,但我不确定它是否正确。不幸的是,将

我一直在研究FRP,发现了许多不同的实现。我看到的一个模型是我将称之为“信号”表示的模型。这一基本要素将事件和行为组合成一个实体

首先,信号是一个对象,其价值是一种行为。其次,信号有一个事件“流”,可以作为标准数据结构查看和操作(可以在信号上使用“每个”、“映射”和“过滤器”等来定义事件的反应方式)。例如,我可以这样做(其中“time”是时间的信号表示):

FRP的表示是否正确,或者是否存在任何问题?我很喜欢这种工作方式,也很喜欢用个人的方式来描述它是多么简单,但我不确定它是否正确。

不幸的是,将“事件”和“行为”合并到一个单独的实体“信号”中并不能很好地工作

据我所知,大多数基于信号的FRP实现最终都会按照

type Event a = Signal (Maybe a)
因此,事件的概念并没有消失,也没有真正的简化。事实上,我认为信号类型是一种语义复合。信号之所以流行是因为它们更容易实现

反对信号的主要论点是,它们不能代表连续时间行为,因为它们必须适应离散事件。在Conal Elliott的研究中,行为是时间的简单连续函数

type Behavior a = Time -> a
-- = function that takes the current time as parameter and returns
--   the corresponding value of type  a
相反,信号总是离散化的,并且通常与固定的时间步长相关联。(可以在可变时间步长信号上实现事件和行为,但它本身不是一个好的抽象。)将其与事件流进行比较

type Event a = [(Time,a)]
-- list of pairs of the form (current time, corresponding event value)
单个事件不一定以规则间隔的时间间隔发生

区分行为和事件的理由是,它们的API完全不同。主要的一点是,它们有不同的产品类型:

(Behavior a , Behavior b) = Behavior (a,b)
(Event a    , Event b   ) = Event (a :+: b)
换句话说:一对行为与一对行为相同,但一对事件与来自任一组件/通道的事件相同。另一点是有两种操作

(<*>) :: Behavior (a -> b) -> Behavior a -> Behavior b
apply :: Behavior (a -> b) -> Event a    -> Event b
()::行为(a->b)->行为a->行为b
应用::行为(a->b)->事件a->事件b
具有几乎相同的类型,但语义完全不同。(第一个参数在第一个参数更改时更新结果,而第二个参数不更改。)

总而言之:信号可以用于实现FRP,对于试验新的实现技术很有价值,但对于那些只想使用FRP的人来说,行为和事件是更好的抽象


(完全披露:我已经实现了一个名为Haskell的FRP库。)

因此,与其将“时间”作为行为和事件,不如将“时间”作为行为,将“时钟”作为完全独立的事件流?@Oetzi:啊,我使用的是Haskell符号。我的意思是
行为a
是从时间(
时间
)到
a
类型的某个值的函数,也就是说,它只是一个以当前时间为参数并返回相应值的函数。相反,事件流将是事件发生的列表。没有清晰的方法将两者统一到“信号”的概念中,因为一个行为可以是类似于
example\u behavior(time)=2*time
。是的,这很有意义。我正在为我的论文实现FRP,我想我可能会使用纯行为和事件,然后使用它们实现信号——只是为了比较。非常感谢你的帮助!既然Elm只有信号而没有事件/行为,你怎么看它?@CMCDRANGKAI Elm的
信号
类型是
事件
行为
的混合体。我认为使用不同的类型会更清晰,但我还没有使用Elm来确定具体的例子。
(<*>) :: Behavior (a -> b) -> Behavior a -> Behavior b
apply :: Behavior (a -> b) -> Event a    -> Event b