为什么我们要在FRP中使用Behavior

2024-01-15

我正在学习反应式香蕉。为了理解该库,我决定实现一个虚拟应用程序,每当有人按下按钮时,该应用程序就会增加计数器。

我使用的 UI 库是 Gtk,但这与解释无关。

这是我提出的非常简单的实现:

import Graphics.UI.Gtk
import Reactive.Banana
import Reactive.Banana.Frameworks

makeNetworkDescription addEvent = do
    eClick <- fromAddHandler addEvent
    reactimate $ (putStrLn . show) <$> (accumE 0 ((+1) <$ eClick))

main :: IO ()
main = do
    (addHandler, fireEvent) <- newAddHandler
    initGUI
    network <- compile $ makeNetworkDescription addHandler
    actuate network
    window <- windowNew
    button <- buttonNew
    set window [ containerBorderWidth := 10, containerChild := button ]
    set button [ buttonLabel := "Add One" ]
    onClicked button $ fireEvent ()
    onDestroy window mainQuit
    widgetShowAll window
    mainGUI

这只是将结果转储到 shell 中。我想出了这个解决方案阅读article https://www.haskell.org/haskellwiki/FRP_explanation_using_reactive-banana作者:海因里希·阿普费尔姆斯。请注意,在我的示例中,我没有使用单个Behavior.

文章中有一个网络示例:

makeNetworkDescription addKeyEvent = do
    eKey <- fromAddHandler addKeyEvent
    let
        eOctaveChange = filterMapJust getOctaveChange eKey
        bOctave = accumB 3 (changeOctave <$> eOctaveChange)
        ePitch = filterMapJust (`lookup` charPitches) eKey
        bPitch = stepper PC ePitch
        bNote = Note <$> bOctave <*> bPitch
    eNoteChanged <- changes bNote
    reactimate' $ fmap (\n -> putStrLn ("Now playing " ++ show n))
               <$> eNoteChanged

该示例显示了一个stepper这改变了一个Event into a Behavior并带回一个Event using changes。在上面的例子中我们可以只使用Event我想这不会有什么区别(除非我不明白某些事情)。

那么有人可以阐明何时使用Behavior为什么?我们应该全部转换吗Event尽快吗?

在我的小实验中我不知道在哪里Behavior可以使用。

Thanks


每当 FRP 网络在 Reactive Banana 中“做某事”时,都是因为它对某些输入事件做出反应。它在系统外部执行任何可观察到的操作的唯一方法是连接外部系统以对其生成的事件做出反应(使用reactimate).

因此,如果您所做的只是通过生成输出事件来立即对输入事件做出反应,那么不,您不会找到太多使用的理由Behaviour.

Behaviour对于生成依赖于多个事件流的程序行为非常有用,您必须记住事件发生在不同的时间.

An Event有发生;它具有价值的特定时刻。 ABehaviour在所有时间点都有一个值,没有特殊的时刻(除了changes,这很方便,但有点破坏模型)。

许多 GUI 都熟悉的一个简单示例是,如果我想对鼠标单击做出反应,并让 Shift 键单击执行与未按住 Shift 键时单击不同的操作。与一个Behaviour保存一个指示是否按住 Shift 键的值,这很简单。如果我刚刚有Event对于 Shift 键按下/释放和鼠标单击来说要困难得多。

除了更难之外,它的水平也更低。为什么我必须做复杂的摆弄才能实现像 Shift-Click 这样的简单概念?这choice之间Behaviour and Event是一个有用的抽象,可以用更接近您在编程世界之外思考它们的方式来实现程序的概念。

这里的一个例子是游戏世界中的可移动物体。我could有一个Event Position代表它移动的所有时间。或者我可以有一个Behaviour Position代表它在任何时候都在哪里。通常我会认为该对象是having始终处于一个位置,所以Behaviour是一个更好的概念契合。

另一个地方Behaviours 用于表示程序可以进行的外部观察,您只能检查“当前”值(因为外部系统在发生更改时不会通知您)。

例如,假设您的程序必须密切关注温度传感器,并避免在温度过高时启动作业。与Event Temperature我将预先决定轮询温度传感器的频率(或响应什么)。然后遇到与我的其他示例中相同的问题,即必须手动执行某些操作以使最后的温度读数可供决定是否开始工作的事件使用。或者我可以使用fromPoll做一个Behaviour Temperature。现在我得到了一个代表温度随时间变化的值的值,并且我已经完全摆脱了对传感器的轮询; Reactive Banana 本身会根据需要尽可能频繁地轮询传感器,而我根本不需要为此考虑任何逻辑!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们要在FRP中使用Behavior 的相关文章

  • 如何在自定义 rxcpp 运算符上调用 on_error

    我创建了一个简单的 rx 运算符 它将字符串流转换为 json 流 并且工作正常 但是 我希望能够引发自定义异常 并且我不知道如何调用on error认购方式 操作员称为convertStringToJson可以在此处找到工作示例 http
  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • 在 Windows 上使用堆栈安装 SDL2 for Haskell

    我正在尝试将 SDL2 与堆栈一起使用 我跟着这些说明 https www reddit com r haskellgamedev comments 4jpthu windows sdl2 is now almost painless vi
  • 在 Haskell 中阅读 GraphML

    我正在尝试将包含单个有向图的 GraphML 文件读入 HaskellData Graph http hackage haskell org package containers 0 2 0 1 docs Data Graph html为了
  • Haskell:Where 与 Let

    我是 Haskell 的新手 我很困惑Where vs Let 它们似乎都提供了相似的目的 我读过一些比较Where vs Let但我很难辨别何时使用它们 有人可以提供一些背景信息或者一些示例来说明何时使用其中一种而不是另一种吗 哪里与让
  • 使用通用元组函数一次进行多次折叠

    如何编写一个接受类型函数元组的函数ai gt b gt ai并返回一个函数 该函数接受类型元素的元组ai 类型的一个元素b 并将每个元素组合成一个新的元组ai 那是签名应该是这样的 f a1 gt b gt a1 a2 gt b gt a2
  • 显示未定义的实例

    可以采取任何措施来为未定义的值定义 Show 实例吗 也许存在一些 GHC 扩展 我想要这样的东西 gt print 1 undefined 1 undefined 根据Haskell 2010 报告 第 9 章 http www hask
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • Haskell 中美元符号 ($) 和 id 函数之间有关系吗?

    这几天我正在读一篇评论莫纳德挑战 http mightybyte github io monad challenges 我强烈推荐给像我这样的 Haskell 初学者 我最终得到了这个线程 https news ycombinator co
  • Haskell 中函数和函子有什么区别?只有定义吗?

    在 Haskell 中 当编写函数时 这意味着我们将某个东西 输入 映射到另一个东西 输出 我尝试 LYAH 来理解 Functor 的定义 看起来和普通 Functor 一样 函数被称为函子有什么限制吗 Functor 是否允许有 I O
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 为什么 Haskell 中有协函子和逆变函子的区别,而范畴论却没有区别?

    这个答案是从范畴论的角度来看的 https math stackexchange com a 661989 72174包括以下语句 事实是 协函子和逆变函子之间没有真正的区别 因为每个函子只是一个协变函子 More in details a
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable

随机推荐

  • 固定位置元素继承弹性项目的宽度

    我正在构建一个 UI 它需要在视口底部有一个固定位置 粘性元素 其宽度受主要内容区域的限制 主要内容区域的两侧可以选择具有固定宽度的 同级 左侧和 或右侧边栏 因此我使用 Flexbox 来构建三列结构flex grow 1就主要内容而言
  • 使用 ctypes 访问变量数组的内容

    我使用 ctypes 来访问读取 python 中 C 函数的文件 由于读取的数据巨大且大小未知 我使用 float in C int read file const char file int n int m float data 功能m
  • Python 应用程序不执行任何操作

    在我更改了我不再记得的内容后 这段代码根本停止执行任何操作 Dash Shell import os import datetime class LocalComputer pass def InitInformation Home Loc
  • android:约束布局是否支持RTL

    在 android Studio 的约束布局中支持 RTL 的最佳实践是什么 或者我应该创建一个单独的布局 一个用于英语 另一个用于阿拉伯语 英文版 The Expected layout with Arabic language The
  • Tomcat如何定位webapps目录?

    Tomcat如何定位webapps目录 这个位置设置在哪里 是相对目录吗 它可以在 CATALINA BASE conf server xml in the
  • 使用vba建表时如何指定主键

    我已经用下面给出的建议更新了代码 我已经测试过并且效果很好 供未来用户快速参考 我使用下面的代码创建链接表 而无需为每个用户设置 DSN 如果手动连接 我如何指定主键 Dim sConnect As String Dim db As DAO
  • 使用 asp.net 调用存储过程

    如果我在 web config 文件中定义了连接字符串 如何创建到 SQL 数据库的连接C 代码 抱歉忘记指定 然后调用存储过程 然后我想最终以某种方式使用这些数据作为 GridView 的数据源 以下是 web config 中连接字符串
  • 如何使用 Json.NET 将 IHtmlString 序列化为 JSON?

    我有一个包含通过 JSON 发布的原始 HTML 的字段 该字段最近从字符串转换为 IHtmlString 当这个变化发生时 该字段从一个 JSON 字符串变成一个空对象 并且一堆消耗 JSON 的东西开始爆炸 When it was a
  • 使用curl 时,出于安全原因,如何使我的cacert.pem 保持最新状态?

    我想保持我的根证书为最新状态 以便与 cURL 和 PHP 内部一起使用curl命令 但是当前没有参数可以下载正确的安全连接所需的当前文件并使其保持最新 以及使用示例curl在 PHP 中用于安全连接 需要一个名为cacert pem 用于
  • Option.zip 返回列表,而不是选项

    标准库文档描述zip部分签名为def zip B that GenIterable B Option A B but Some 1 zip Some 2 返回一个List 1 2 not Some 1 2 是实施有问题还是文档有问题 有缺陷
  • 如何使用 C# 将每个单词的第一个字符或整个字符串的第一个字符大写?

    我可以编写自己的算法来做到这一点 但我觉得应该有相当于ruby 的人性化 http api rubyonrails org classes ActiveSupport CoreExtensions String Inflections ht
  • 如何在 Ruby 2.7.0 上安装 Nokogiri

    我最近升级到 Ruby v2 7 0 当我尝试安装 Nokogiri 时 出现以下错误 ERROR Error installing nokogiri The last version of nokogiri gt 0 to support
  • 根据另一列中的值有条件地使用颜色填充特定列中的单元格

    我有以下数据框 col1 lt rep c A B C D 10 col2 lt rep c 1 0 10 col3 lt rep c 0 1 10 col4 lt rep c 1 0 10 col5 lt rep c 0 1 10 tes
  • Git“实时服务器”最佳实践

    我和我的合作伙伴一直在尝试从影响公众可查看的文件的存储库中推送和拉取的想法 而不是将存储库存储在隐藏位置 并在我们认为文件可以使用时仅通过 FTP 传输文件 虽然能够直接推送到 实时站点 将非常方便 但我想知道这会产生什么负面影响 如果有的
  • 在浏览器中编译一个“.vue”组件,只用JS?

    我想将 vue 组件 包含 html js css 编译为 JS 但在浏览器端 没有 browserify vuify webpack 或其他 在一个更好的世界中 我想将我的 vue 组件包含到我的 html 应用程序中 就像这样 不需要在
  • Google 表格中的 SUBQUERY 等效项

    使用查询 我尝试计算当月注册的托盘最多的当天注册的托盘的最大数量 该栏将启动 最大日 我的电子表格的链接 https docs google com spreadsheets d 1DkLmJUUFJgnlMD2u PYcxmPlal ar
  • 熊猫压平一列中的列表列表?

    我正在尝试压平一列 该列是列表的列表 var var2 0 9122532 0 458182615 0 79834910 0 1 79834910 0 458182615 0 9122532 0 2 458182615 0 79834910
  • 尝试播放声音时出错

    类似这个问题Matlab 中的基本声音错误 https stackoverflow com q 9369833 501663 没有答案 当我尝试播放声音 Matlab 2012a Windows 7 64位 时 使用sound sounds
  • java中的继承和超类(Object, Class)

    Is java lang Object隐式继承的所有自定义类 对象的超类 我以为java不支持多重继承 我问的原因是我是否已经从自定义类中的另一个类继承 并且 java 再次强制隐式继承java lang Object最重要的是 这不是多重
  • 为什么我们要在FRP中使用Behavior

    我正在学习反应式香蕉 为了理解该库 我决定实现一个虚拟应用程序 每当有人按下按钮时 该应用程序就会增加计数器 我使用的 UI 库是 Gtk 但这与解释无关 这是我提出的非常简单的实现 import Graphics UI Gtk impor