问题标签 [yampa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - Haskell/Yampa 和 HOOD 中游戏对象的调试输出
我一直坚持使用 Haskell/Yampa (=Arrows)(使用 HOOD)为我的游戏对象生成调试输出。
我的引擎基本上运行一个游戏对象列表,这些对象生成输出状态(线、圆),然后渲染。
玩家对象只是向右移动并表示为(定位的)圆圈。
mover 只是一个简单的积分器(加速度-> 速度-> 位置),我想在其中观察速度并将其作为调试输出渲染为(未定位的)线。
如何为我的游戏对象函数的内部值创建额外的图形调试输出?
实际应该发生的是在输出中,首先渲染实际对象(圆),但还要渲染额外的调试输出(运动矢量作为线)。可能我可以用 HOOD 实现这一点,但我仍然不熟悉 Haskell 并且不知道如何为我的案例采用 HOOD 教程。
haskell - 防止 Yampa/Animas 中的无限循环与 SF 相互依赖
我试图了解这种函数式反应式编程是如何工作的,但我遇到了一个问题。我正在尝试创建一个boid 模拟,但我开始的速度很慢,我现在已经将一个 boid 定义为一个函数,它采用一个起始位置并创建一个从一个位置到一个位置的信号函数,其中输入是点它正在移动,输出是当前位置:
seek 函数需要两个输入(因为循环)。当前位置和目标位置。然后它只是创建一个从当前位置指向目标位置的向量,其大小为 50,即速度。然后对速度进行积分并添加起始位置。最后,信号被一分为二,一个可以成为输出,另一个可以循环回搜索功能。
现在我可以像这样定义 boids:
这里 aBoid 向点 (500, 500) 寻找,而 bBoid 向 aBoid 寻找。
我的问题是,当我希望这两个 boids 互相寻找时。当我这样做时:
该程序只是打印:ProgramName: <<loop>>
我认为这意味着它进入了一个无限循环。
我也尝试过使用这样的par
功能:
这里route
函数只是将每个 boid 的输出映射到另一个 boid 的输入(如zip
,但偏移量为 1)
这也给出了<<loop>>
信息。
我认为在处理反应式系统时,让对象依赖于彼此的状态应该是一个很常见的问题,所以我希望有一些优雅的解决方案。
我应该补充一点,我发现这个 FRP 东西非常困难并且经常令人困惑,所以我不确定我是否有道理;)
haskell - 使用 Yampa 和 yampa-glut 获取关键输入
AFRP 的整个主题听起来非常令人兴奋,我正在尝试在其中开始我自己的项目。我找到了Yampa和yampa-glut,这似乎是与 GLUT 的良好绑定(看起来,GLUT是唯一同时在 Windows 和 Linux 上运行的图形库)。
yampa-glut
源码附带了一个简单的例子,我复制过来学习了。然后我想扩展它,为关键事件添加一个简单的测试。它的完整来源在这里,除了第 23 行和 keys 函数外,没有什么新东西:
每当我按下或释放一个键时,预期的结果是外壳上的简单输出。但它没有发生,没有输出。
如果我将最后一行之前的行更改为:
然后我得到一些关键输入,但不是全部,很多都被跳过了。
我找不到对此的解释,所以我希望有人能向我解释我哪里出错了,我可以做些什么来获得键盘和鼠标按钮输入。
haskell - Yampa 中反应(感觉)功能的时差
我目前正在学习 Haskell 和 Yampa,并且对反应函数有疑问。
正如您在类型签名中看到的,感知函数的部分输出是函数的当前调用和上一次调用之间的时间差。在我看到的例子中,这个时间差是“手动”计算的,使用 IORef 来保持前一次调用的值。
您必须使用外部状态来跟踪时间差,这似乎很奇怪,为什么不在 reactimate 函数中进行此计算?IORef 是处理它的好方法吗?
haskell - 扬帕值开关
我有一个事件SF Input (Event ())
,代表空格键的键。我有一些gravity
,每次用户释放密钥时,它都必须在1
和之间切换(-1)
。所以我这样做了:
但它所做的是在重复时上下切换值,直到我再次按下该键。我不知道我在哪里做错了。
完整的来源在这里,也许有人可以帮助我。
haskell - 如何解决箭头的一阶约束?
我所说的一阶约束是什么意思
首先,我将解释我所说的对箭头的一阶约束的含义:由于箭头脱糖的方式,您不能在箭头 do-notation 中需要箭头命令的地方使用本地绑定名称。
下面是一个例子来说明:
proc x -> f -< x + 1
desugar toarr (\x -> x + 1) >>> f
和类似地desugar proc x -> g x -< ()
to arr (\x -> ()) >>> g x
,其中第二个x
是自由变量。GHC 用户指南解释了这一点,并说当你的箭头也是一个单子时,你可以创建一个实例ArrowApply
并使用app
它来解决这个问题。像,proc x -> g x -<< ()
变成arr (\x -> (g x, ())) >>> app
.
我的问题
Yampa 定义了accumHold
这种类型的函数:a -> SF (Event (a -> a)) a
. 由于箭头的这种一阶限制,我正在努力编写以下函数:
上面的定义不起作用,因为n
脱糖后不在范围内。
或者,类似地这个函数,其中对的第一部分SF
是要传递给的初始值accumHold
是否有一些我缺少的组合器或技巧?ArrowApply
或者没有实例就不可能编写这些定义?
tl; dr:是否可以在 yampa中定义accumHoldNoiseR :: (RandomGen g, Random a) => (a,a) -> g -> SF (Event (a -> a)) a
或定义?accumHold' :: SF (a,Event (a -> a)) -> a
注意:没有ArrowApply
for 的实例SF
。我的理解是,定义一个也没有意义。有关详细信息,请参阅“使用箭头编程”。
haskell - 在 Yampa 中模拟弹簧/阻尼器系统
我正在尝试使用 Yampa 进行一些基本的系统仿真,就像我在 Simulink 中所做的那样。在这种情况下,我想模拟这个 simulink 教程介绍的弹簧和阻尼器系统。我编写了以下信号函数来表示系统:
该feedback
函数创建一个基本的反馈循环并实现如下:
哦,还有:
有了合理的正常数,我得到了一个非常不稳定的系统:
我构建反馈循环或应用集成的方式是否存在明显错误?
haskell - 箭头 FRP 中的连续信号切换
我一直在使用 Haskell(尤其是 Yampa)中的 Arrowized FRP 库,但我不太清楚如何进行“连续”切换。我的意思是信号通过一个信号函数(sf
下图),该函数本身就是一个信号(如图上半部分所示)。
由于我不提前知道开关的参数是什么,所以我看不出如何将其简化为更简单的二进制开关。
如果可能的话,应该怎么做呢?我更喜欢 Yampa 代码,但对任何带箭头的 FRP 代码都很满意。我还没有尝试过其他库(例如 Sodium 或 Reactive Banana)来知道在这些情况下我是否会有同样的困惑,但我也对它们很好奇。
编辑
为了使这一点更清晰更具体,我已标记了图像;标签的可能类型有:
在:
Either Int (Int -> Int)
1:
(Int -> Int) -> (Either Int (Int -> Int) -> (Int -> Int))
sf 可以是:
(Either Int (Int -> Int) -> (Int -> Int)) -> Either Int (Int -> Int) -> (Int -> Int)
(例如,app
)。但这仅是当标有问号的部分表示对sf
. 如果它表示更复杂的开关,则类型为
(Either Int (Int -> Int) -> (Int -> Int)) -> (Int -> Int)
反而。
- 2和out几乎无关紧要。
这个想法是我希望电路表现得好像 sf
是app
,标记的信号f
表示应用于 的函数in
,并且它本身是s 和s 本身in
的参数的来源。我想得到一个可以处理输入并根据这些输入动态改变其行为(构成它的信号函数)的电路。f
f
一方面,在我看来sf
,实际上不可能app
,因为在这种情况下,我们没有ArrowApply
; 但另一方面,我想通过某种形式的复杂切换可以实现相同的行为。
haskell - 对Yampa开关图感到困惑
有一些Yampa开关的图表在:
http://www.haskell.org/haskellwiki/Yampa/switch
http://www.haskell.org/haskellwiki/Yampa/rSwitch
http://www.haskell.org/haskellwiki/Yampa/kSwitch
(等等)。
我发现,switch
唯一一张带有描述的图表,是最容易理解的。其他人似乎很难按照类似的符号来阅读图表。例如,尝试rSwitch
使用 中使用的符号读取switch
可能是:
是一个递归 SF,它总是被输入一个“in”类型的信号并返回一个“out”类型的信号。从相同类型的初始 SF 开始,但在 switch 函数(?[cond])方块之外的人)也可以通过事件(
Event (SF in out)
签名处的类型)传递一个新的 SF,同时满足条件(对于 '? ' 在 [cond] 方格之前)。在事件的情况下,Yampa 将使用新的 SF 而不是现有的。这个过程是递归的,因为'?' (不能从图中得到它,除了 rSwitch 的签名似乎是递归的)。
在我查看 的源代码之后rSwitch
,它看起来像是switch
在触发时递归地切换到相同的 init SF t
(根据图中描述的内容,尽管我看不到t
源代码中会触发什么特殊内容代码)。
在 Yampa Arcade 中,它dpSwitch
通过代码和示例进行了解释。而关于游戏“Frag”的论文也使用了dpSwitch
. 然而rSwitch
,这些教程中似乎没有。所以我真的不知道如何使用r-
或k-
串行开关,以及在什么情况下我们需要它们。