当前位置: 首页 > 知识库问答 >
问题:

如何绕过箭头上的一阶约束?

邢英奕
2023-03-14

我所说的一阶约束是什么意思

首先,我将解释箭头上的一阶约束的含义:由于箭头的方式不美观,您不能使用本地绑定的名称,在箭头操作符号中需要箭头命令。

下面是一个例子来说明:

程序x-

我的问题

Yampa用以下类型定义了函数:

accumHoldNoiseR :: (RandomGen g, Random a) => (a,a) -> g -> SF (Event (a -> a)) a
accumHoldNoiseR r g = proc f -> do
  n <- noiseR r g -< ()
  accumHold n -< f

上面的定义不起作用,因为脱胶后n不在范围内。

或者,类似于此函数,其中到SF的配对的第一部分是传递给accumHold

accumHold' :: SF (a,Event (a -> a)) -> a
accumHold' = ...

有没有我错过的组合或技巧?或者,如果没有ArrowApply实例,就无法编写这些定义?

tl; dr:有没有可能定义累积的HoldNoiseR:: (随机生成g,随机a)=

注意:SF没有ArrowApply的实例。我的理解是,定义一个也没有意义。有关详细信息,请参阅“使用箭头编程”。


共有3个答案

慕冠宇
2023-03-14

为了帮助其他人理解我是如何解决这个问题的,我将回答自己的问题。

我试图实现乒乓球游戏。我希望球每回合以随机速度开始。我想使用累积保持来定义球的速度。我有一些这样的代码

ballPos = proc e -> mdo -- note the recursive do
  {- some clipping calculations using (x,y) -}
  ...
  vx <- accumHold 100 -< e `tag` collisionResponse paddleCollision
  vy <- accumHold 100 -< e `tag` collisionResponse ceilingFloorCollision
  (x,y) <- integral -< (vx,vy)
  returnA -< (x,y)

我想用随机值代替100(大概是来自noiseR)。

我解决这个问题的方法是在方向上累加,collisionResponse只需翻转标志(最终我想使用相对于墙壁/桨叶的速度角):

ballPos = proc (initV, e) -> mdo
  {- some clipping calculations using (x,y) -}
  ...
  (iVx,iVy) <- hold (0,0) -< initV
  vx <- accumHold 1 -< e `tag` collisionResponse paddleCollision
  vy <- accumHold 1 -< e `tag` collisionResponse ceilingFloorCollision
  (x,y) <- integral -< (iVx*vx,iVy*vy)
  returnA -< (x,y)

经验教训:

您通常可以将想要累积的值/状态分离为一个描述其变化方式的行为和一个描述其当前值的“量值”,并将该行为作为输入。在我的例子中,我分离出初始速度的大小,将其作为输入传递给信号函数,并使用accumHold计算碰撞对球的影响(行为)。所以不管初始速度是多少,撞击墙壁都会“反射”球。这正是accumHold所积累的。

松刚豪
2023-03-14

noiseR是一个信号函数;它产生一个随机数流,而不仅仅是一个随机数(为此,您只需使用System.随机)。

另一方面,accumHold的第一个参数只是一个初始值。

因此,这不仅仅是一些限制——它实际上防止您犯类型错误。

如果我正确理解你想做什么,那么简单地使用随机R应该可以做到。否则,请澄清为什么需要noiseR

谯嘉木
2023-03-14

这是一个理论上的答案。看看Roman Cheplyaka对这个问题的回答,它更多地涉及到你想要实现的实际细节。

n超出范围的原因是,要在那里使用它,您将拥有与bind

因此,可以在创建ArrowApply实例时,将n作为函数参数提供给后续箭头。

Chris Kuklewicz在他的评论中正确地指出,-

除非您使用箭头Apply,否则不会。这就是ArrowApply的用途。

 类似资料:
  • 如何在按钮中显示向上箭头符号?分别,我希望它在单击向下箭头时发生更改。我该怎么做?? 我试过了,但是。。。。

  • 问题内容: 我已经建立了一个具有单个文本输入的简单组件,并且在该列表的下方(使用语义ui)构建了一个组件。 现在,我想使用箭头键浏览列表。 首先,我必须选择第一个元素。但是,如何访问特定的列表元素? 其次,我将获取当前所选元素的信息并选择下一个元素。如何获取选择了哪个元素的信息? 选择将意味着将类添加到项目中,还是有更好的主意? 问题答案: 尝试这样的事情: 光标会跟踪您在列表中的位置,因此当用户

  • 嘿,我正在尝试设置homeindicator在我的操作栏,但看起来像箭头有一个白色,我尝试了很多事情,我已经设置了一个缩放作为一个家庭指示器,但同样的问题,它是白色的,这里是我尝试的。 我使用的主题 结果我得到了结果 我所期待的:预期的结果 箭头缩放文件

  • 问题内容: 我有选择的元素,我想删除的箭头,然后我可以添加其他图标..我能做到这一点的Firefox Safari和Chrome,但这并没有工作 IE9 。 SEE 小提琴上的 IE9 。我所需要的就是删除ie9中的箭头,请JSFIDDLE回答。 问题答案: 在IE9中,由于您已自定义div的高度和宽度并进行选择,因此需要更改css使其与您的css相匹配。 如果是IE10,则可以在css3以下使用

  • 我已经用jwt实现了Spring Security性,并且运行良好。

  • 本文向大家介绍Swift箭头,包括了Swift箭头的使用技巧和注意事项,需要的朋友参考一下 示例 Arrow是Swift中一个优雅的JSON解析库。 它允许在<--运算符的帮助下解析JSON并将其映射到自定义模型类: 示例 斯威夫特模型 JSON文件 制图 用法 安装: 迦太基 可可豆 手动地 只需复制并粘贴Arrow.swift到您的Xcode项目中 https://github.com/s4c