对 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 开关的图表感到困惑 的相关文章

  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen
  • 用于遇到 [...] 的 Haskell Parsec 解析器

    我正在尝试使用 Parsec 在 Haskell 中编写一个解析器 目前我有一个可以解析的程序 test x 1 2 3 end 执行此操作的代码如下 testParser do reserved test v lt identifier
  • 如何在haskell中获取变量名称

    我来到 haskell 时有一些 c 背景知识 想知道是否有类似的 define print a printf s d n a a int a 5 print a 应该打印 a 5 这是 augustss 提到的 TH 解决方案 LANGU
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 如何判断何时创建新组件?

    我一直在寻找背后的逻辑当有人在 AngularJS Angular 上的 Web 应用程序中创建新组件时但我认为这更通用 可能适用于所有基于组件的前端框架 我知道有像这样的一些原则应该是抽象的和可重用的但例如我在角度文档中看到 每个单独的路
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 构造微积分中的“Refl”东西?

    在语言中 例如Agda Idris or Haskell对于类型扩展 有一个 键入类似于以下内容的内容 data a b where Refl a a a b意思是a and b是相同的 这样的类型可以定义在结构演算 https en wi
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored
  • Control.Parallel.Strategies 中 Eval 的绑定运算符如何严格评估其参数?

    Control Parallel Strategies 的源代码 http hackage haskell org packages archive parallel 3 1 0 1 doc html src Control Paralle
  • 如何同时将透镜(或任何其他光学器件)视为吸气剂和设置剂?

    我正在尝试编写一个通用记录更新程序 它允许人们轻松更新记录中的字段existing记录 字段形状相似incoming记录 这是我到目前为止所拥有的 applyUpdater fields existing incoming let gett

随机推荐

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

    我有一个包含两个表的数据库 让我们称它们为 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