如果你想感受一下玻璃钢,你可以从旧的开始弗兰教程 http://conal.net/fran/tutorial.htm从 1998 年开始,有动画插图。对于论文,从功能反应动画 http://conal.net/papers/icfp97/然后跟踪我主页上的出版物链接和FRP http://haskell.org/haskellwiki/FRP链接上的哈斯克尔维基 http://haskell.org/haskellwiki/Haskell.
就我个人而言,我喜欢思考什么是FRPmeans在讨论如何实施之前。
(没有规范的代码是没有问题的答案,因此“甚至没有错误”。)
因此,我不会像 Thomas K 在另一个答案(图、节点、边、触发、执行等)中那样用表示/实现术语来描述 FRP。
有很多种可能的实现方式,但没有一个实现说明了 FRP 的含义is.
我确实对 Laurence G 的简单描述产生了共鸣,即 FRP 是关于“代表‘随时间变化’的值的数据类型”。
传统的命令式编程仅通过状态和突变间接捕获这些动态值。
完整的历史(过去、现在、未来)没有一流的表现。
而且,仅离散演化由于命令范式在时间上是离散的,因此可以(间接)捕获值。
相比之下,FRP 捕捉了这些不断变化的价值directly并且没有任何困难不断地不断发展的价值观。
FRP 的不同寻常之处还在于,它是并发的,但不会与困扰命令式并发的理论和实用老鼠巢发生冲突。
从语义上来说,FRP的并发性是细粒度的, 确定的, and 连续的。
(我说的是含义,而不是实现。实现可能涉及也可能不涉及并发或并行性。)
语义确定性对于严格推理和非正式推理都非常重要。
虽然并发性给命令式编程增加了巨大的复杂性(由于非确定性交错),但在 FRP 中却毫不费力。
那么,什么是玻璃钢?
你本来可以自己发明的。
从这些想法开始:
动态/演变的价值观(即“随着时间的推移”的价值观)本身就是一流的价值观。您可以定义它们并组合它们,将它们传入或传出函数。我把这些东西称为“行为”。
行为是由一些原语构建的,例如恒定(静态)行为和时间(如时钟),然后进行顺序和并行组合。n通过应用 n 元函数(在静态值上)“逐点”(即随时间连续)来组合行为。
为了解释离散现象,有另一种类型(系列)的“事件”,每个事件都有一个发生流(有限或无限)。每次发生都有相关的时间和值。
要想出可以构建所有行为和事件的组合词汇,请玩一些例子。继续解构为更通用/简单的部分。
为了让你知道你有坚实的基础,使用指称语义技术为整个模型提供一个组合基础,这意味着(a)每种类型都有一个相应的简单而精确的数学类型的“含义”,并且( b) 每个原语和运算符都有一个简单而精确的含义,作为成分含义的函数。永远不能将实施考虑因素融入到您的探索过程中。如果此描述对您来说是胡言乱语,请参阅 (a)具有类型类态射的指称设计 http://conal.net/papers/type-class-morphisms, (b) 推拉函数反应式编程 http://conal.net/papers/push-pull-frp(忽略实现位),以及 (c)指称语义Haskell 维基百科页面 http://en.wikibooks.org/wiki/Haskell/Denotational_semantics。请注意,指称语义有两个部分,分别来自其两位创始人 Christopher Strachey 和 Dana Scott:更简单且更有用的 Strachey 部分和更难且不太有用(对于软件设计)Scott 部分。
如果您坚持这些原则,我希望您或多或少会得到一些符合 FRP 精神的东西。
我从哪里得到这些原则?在软件设计中,我总是问同样的问题:“这意味着什么?”。
指称语义为我这个问题提供了一个精确的框架,并且符合我的审美(与操作或公理语义不同,这两者都让我不满意)。
所以我问自己什么是行为?
我很快意识到命令式计算的时间离散性质是对特定风格的适应machine,而不是行为本身的自然描述。
我能想到的最简单的行为精确描述就是“(连续)时间的函数”,所以这就是我的模型。
令人高兴的是,这个模型可以轻松优雅地处理连续的、确定性的并发。
正确有效地实施这个模型是一个相当大的挑战,但那是另一回事了。