对 Yampa 开关的图表感到困惑

2024-03-16

有一些 Yampa 开关的图表:

http://www.haskell.org/haskellwiki/Yampa/switch http://www.haskell.org/haskellwiki/Yampa/switch

http://www.haskell.org/haskellwiki/Yampa/rSwitch http://www.haskell.org/haskellwiki/Yampa/rSwitch

http://www.haskell.org/haskellwiki/Yampa/kSwitch http://www.haskell.org/haskellwiki/Yampa/kSwitch

(等等)。

我发现switch是唯一一张带有说明的图表,是最容易理解的图表。其他人似乎很难按照类似的符号来阅读图表。例如,尝试阅读rSwitch与中使用的符号switch may be:

是一个递归 SF,它总是被输入“in”类型的信号并且 返回“out”类型的信号。从相同的初始 SF 开始 类型,但 switch 函数(?[cond])方块之外的人可能 还通过事件传递一个新的 SF(类型Event (SF in out)在 签名)当条件满足时(对于前面的“?” [条件] 方)。如果发生该事件,Yampa 将使用新的 SF 而不是现有的。这个过程是递归的,因为“?” (不能 从图中得到它,除了 rSwitch 的签名似乎 递归)。

在我研究了来源之后rSwitch,看起来它使用switch递归地切换到相同的 init SF,同时t被解雇(根据图中的描述,虽然我没有看到有什么特别的t会在源代码中被触发)。

在扬帕拱廊 (Yampa Arcade) 中,它解释了dpSwitch带有代码和示例。关于游戏“Frag”的论文也使用了dpSwitch。但是,那rSwitch这些教程中似乎没有。所以我真的不知道如何使用r- or the k-串行交换机,以及在什么情况下我们需要它们。


全部switch函数是改变信号函数使其行为类似于另一个信号函数的方法。我个人认为 Yampa 图有点难以解析,但是各种开关的类型签名很好地指示了如何理解它们。一旦理解了类型签名,图表就会变得更加清晰。switch本身就是最基本的:

switch :: SF a (b, Event c) -> (c -> SF a b) -> SF a b

如果我们查看该类型,它会准确地告诉我们它的作用:它需要一个 SFsf和 SF 发生器sfg. sf产生类型的值(b, Event c),信号函数发生器的输入也恰好是类型c。所以,每当sf的事件发生,SF将切换到SF生成器的结果。在事件发生之前,生成的 SF 将返回原始 SF 的值。

这个想法也被运用在rswitch and kswitch变体,但略有不同。


rswitch:这称为“外部开关”,意味着 SF 将在不对其输入或输出进行任何分析的情况下进行切换。让我们看一下类型签名:

rswitch :: SF a b -> SF (a, Event (SF a b)) b

它需要一个 SF 作为类型的输入值a并输出类型的值b. rswitch创建一个新的 SF 也产生输出b,但需要额外的输入类型Event (SF a b)。请注意,事件值的类型与输入类型匹配。这意味着每当事件发生时,该 SF 就会切换到该事件值。然而,SF 的类型仍然存在SF (a, Event (SF a b)) b。这意味着 SF 可以自由地接收新 SF 的附加事件,这将影响整个 SF 的行为。其用途之一可能是游戏中的人工智能行为:

moveFollowTarget :: SF TargetPosition Velocity
moveShootTarget :: SF TargetPosition Velocity
moveIdle :: SF TargetPosition Velocity

aiMovement :: SF (TargetPosition, Event (SF TargetPosition Velocity)) Velocity
aiMovement = rswitch moveIdle  -- Initially idle...

aiMovementManager :: SF a (Event (SF TargetPosition Velocity))
aiMovementManager = ... whatever ...

在这里,aiMovementManager每当AI的运动行为需要改变时就会触发一个事件,该事件的值将是运动应该改变到的SF。


kswitch: 这被称为intrinsic switch,因为 SF 的内容经过分析以确定正确的开关应该是什么。让我们回顾一下类型签名

kswitch :: SF a b -> SF (a, b) (Event c) -> (SF a b -> c -> SF a b) -> SF a b

Here, kswitch需要三个参数,sf, analyzer, and mapping. sf只是一个标准 SF,其输入类型为a和类型的输出b. sf是信号最初的行为方式。analyzer是一个 SF,其输入和输出为sf并且可能会也可能不会触发某种其值具有类型的事件c。如果它没有触发事件,那么什么也不会发生,并且 SF 继续表现得像sf。如果它确实触发了一个事件,那么两者sf并将事件值传递给mapping它确定要切换到的新 SF。kswitch当根据输出改变系统的行为方式时非常有用。

一个有用的例子是算法TCP 拥塞避免 http://en.wikipedia.org/wiki/Additive_increase/multiplicative_decrease。在这里,我们查看是否丢失网络数据包,以及提高或降低请求数据的速度。

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

对 Yampa 开关的图表感到困惑 的相关文章

  • 函数式编程是否避免了状态?

    根据维基百科 http en wikipedia org wiki Functional programming 函数式编程是一种编程范式 它将计算视为数学函数的评估避免状态和可变数据 强调我的 这是真的吗 我个人的理解是 它使状态更加明确
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • GHC 是否使用存在类型的动态调度?

    下面的代码是否使用了 C 或 Java 中所理解的动态调度 据我了解 在最后一行 编译器不可能在编译时知道要调用哪个 实现 但代码会编译并产生正确的结果 有人可以解释一下 这背后有什么样的实现 例如 vptr 吗 LANGUAGE Exis
  • 我应该使用镜头中的什么来按索引构建只读吸气剂?

    我有一个内部细节被隐藏的类型 我想提供某种镜头 可以在特定索引处读取所述类型的元素 但是not修改它们 一个Ixed我的类型的实例似乎没有做我想要的事情 因为它明确允许修改 尽管不允许插入或删除 如果我想允许只读索引 我不确定我使用什么 如
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 反应性香蕉时间延迟

    我已经查阅了文档反应香蕉 http hackage haskell org package reactive banana 而且我找不到指定明确时间延迟的方法 举例来说 我想采取Event t a并将其所有发生的事件移至未来 1 秒 或获取
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi
  • C# 中我们需要定点组合器吗?

    我在 C 中使用递归 lambda 并在网络上找到了两种执行此操作的方法 一种方法使用定点组合器 http en wikipedia org wiki Y combinator而另一个则没有 在下面的代码中 f1是使用组合器构建的 f2是直
  • 简单的秒差距示例会产生类型错误

    我正在尝试编译这个简单的秒差距代码 import Text Parsec simple letter 但我不断收到此错误 No instance for Stream s0 m0 Char arising from a use of let
  • 如何在 F# 中执行 Seq.takeWhile + 一项

    我想编写一个使用谓词过滤序列的函数 但结果还应该包括谓词返回 false 的第一个项目 如果 F 中有一个break关键字 逻辑将是这样的 let myFilter predicate s seq for item in s do yiel
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而
  • Parsec 函数“parse”和类“Stream”的类型签名

    约束条件是什么 Stream s Identity t 下面的类型声明是什么意思 parse Stream s Identity t gt Parsec s a gt SourceName gt s gt Either ParseError
  • 没有由文字“1”产生的 Num String 实例

    main do putStrLn myLast 1 2 3 4 myLast a gt a myLast x x myLast xs myLast xs 当我尝试运行此代码时 我收到此消息 没有由文字 1 产生的 Num String 实例
  • Swift:配对数组元素的最佳方法是什么

    我遇到了一个需要成对迭代数组的问题 最好的方法是什么 或者 作为替代方案 将数组转换为对数组 然后可以正常迭代 的最佳方法是什么 这是我得到的最好的 这个需要output成为一个var 而且它并不是很漂亮 有没有更好的办法 let inpu
  • Haskell 中实例声明的参数顺序切换

    我想进行实例声明 但自由类型变量不是最后一个变量 例如 我有一个类声明 class Poppable m where tryPop m a gt Maybe a m a 现在我想让 Q PSQ 优先级队列 成为 Poppable 的实例 具
  • rxjs 主题应该在课堂上公开吗?

    假设我有两个类 您可以在其中观察一些可观察量 第一个例子 公共主题 class EventsPub public readonly onEnd new Subject
  • 如何识别 Java 中的不可变对象

    在我的代码中 我正在创建一个对象集合 这些对象将由各种线程以只有在对象不可变的情况下才安全的方式访问 当尝试将新对象插入到我的集合中时 我想测试它是否是不可变的 如果不是 我将抛出异常 我能做的一件事是检查一些众所周知的不可变类型 priv
  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 在 Haskell 中创建 100 万个线程需要多长时间?

    据我了解 Haskell 有绿色线程 但它们的重量有多轻 是否可以创建100万个线程 或者 100 000 个线程需要多长时间 from here http www reddit com r programming comments a4n
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数

随机推荐

  • 数据库理论-两个表之间的关系

    我有一个包含两个表的数据库 让我们称它们为 Foo 和 Bar 每个 foo 可以与任意数量的 bar 相关 每个 bar 也可以与任意数量的 foo 相关 我希望能够通过一个查询检索与特定 bar 关联的 foo 以及与特定 foo 关联
  • Android USB 配件多线程

    我遇到了由多线程和 Android Open Accessory 引起的问题 我需要与 USB 附件通信 但我需要从 2 个线程进行通信 一个线程生成并发送数据 另一个线程读取数据 为什么我不使用单线程 因为在读取之前可能有 1 次或多次写
  • 使用 Rust 从不同偏移量的文件中读取

    我正在开发一个项目 该项目涉及从不同偏移量的文件中读取不同的信息 目前 我正在使用以下代码 SECTORS PER CLUSTER starts at 13 opened file seek SeekFrom Start 13 unwrap
  • 如果在 javascript 中返回,如何抓取搜索结果(使用 python)

    我想要抓取的网站使用 JavaScript 填充返回 我可以简单地以某种方式调用脚本并处理其结果吗 当然 没有分页 我不想运行整个过程来抓取生成的格式化 HTML 但原始源是空白的 看一看 回报的来源很简单
  • 问:在 rmarkdown html 中的 for 循环中创建传单地图

    我正在尝试在 rmarkdown 文件中创建带有 for 循环的传单地图 这是一个最小的例子 title Test output html document r quakes echo F data quakes library leafl
  • AMP Html 无法在 iphone safari 浏览器上运行以进入新窗口

    最近 我正在使用 Accelerated Mobile Pages AMP 开发渐进式 Web 应用程序 我必须添加锚链接target blank 以便用户单击该链接将被重定向到带有锚点位置的新窗口 a href External Url
  • Angular.js ng-style 不会绑定值

    我在 angularjs 上遇到了问题 即使经过研究 我也找不到错在哪里 我需要重新计算元素的 css 值 left 我正在使用 ng style 指令和一个将返回具有 css 值的对象的方法 这就是 据我所知 我必须做的 但是当我更新值时
  • 项目骑手 - 构建时查看 msbuild 输出

    当我尝试构建解决方案时 我想查看 msbuild 日志 它最初是 Visual Studio 2015 的解决方案 Rider 的输出构建窗口 视图 gt 工具窗口 gt 构建 显示 Microsoft R 构建引擎版本 14 0 2542
  • 使用 git rebase 时自动跳过空提交

    通常 你必须做git rebase skip 如果有一个开关可以自动跳过这些空提交 那就太好了 有人知道怎么做吗 非常古老的话题 但对我来说是搜索引擎上的第一个结果 我终于发现有一个 empty参数可以采用以下值之一 keep drop 和
  • Android 词典应用程序

    我想在字典之上开发一个应用程序 即使用字典作为其一部分的应用程序 市场上有用于此目的的任何字典应用程序吗 遵循 GPL 的应用程序是更好的 还有那些使用本地数据库的应用程序而不是使用网络连接是更好的选择 如果没有 市场上是否有可用的词典数据
  • 使用 Android Studio 将 iTextG 包含在 Android 项目中

    在 Android Studio 中包含 iTextG 时出现以下错误 com android dex DexException Multiple dex files define Lcom itextpdf awt geom Affine
  • GAE/P:API 调用的交易安全

    假设您使用交易来处理 Stripe 付款并更新用户实体 ndb transactional def process payment user key amount user user key get user stripe payment
  • Python:捕获任何异常并将其放入变量中

    为了弄清楚如何避免一些递归 我需要捕获任何异常 编辑 不仅仅是从 Exception 派生的异常 而是所有异常 包括 KeyboardInterrupt 和用户异常 将其放入变量中 然后重新引发它位于 catch 块之外 本质上 我正在尝试
  • 如何使用 mixpanel API?

    我无法连接到 mixpanel 我尝试过使用正确的 api key 和 api secret 如下所示
  • 调度程序 Invoke(...) 与 BeginInvoke(...) 混淆

    我很困惑为什么我不能在 Count 方法中的 Dispatcher 上使用 BeginInvoke 来使此测试计数器应用程序与 2 个 或更多 同时运行的 countertextbox 一起使用 您可以通过将 BeginInvoke 替换为
  • 查找 CMake 的包 Eigen3

    CMake 找不到我的Eigen3包裹 我设置了一个名为的环境变量 EIGEN3 INCLUDE DIR 指向路径所在的位置FindEigen3 cmake is 然后在 CMakelists txt 中我写道 find package E
  • 嵌入式 SurveyMonkey 调查未出现在移动设备上

    我希望将现有的猴子调查嵌入到网页中 请按照此处的说明进行操作 http help surveymonkey com articles en US kb Website Collector http help surveymonkey com
  • perl 从 imap 消息中获取所有消息头

    I use Mail IMAPClient https metacpan org pod Mail IMAPClient 有一些变数 body imap gt body string msg header imap gt message s
  • JSON Post 调用错误函数

    我有这个 jquery post 调用 它以某种方式调用错误函数 即使它将数据完美地输入数据库
  • 对 Yampa 开关的图表感到困惑

    有一些 Yampa 开关的图表 http www haskell org haskellwiki Yampa switch http www haskell org haskellwiki Yampa switch http www has