gpt4 book ai didi

haskell - 防止 Yampa/Animas 中 SF 相互依赖的无限循环

转载 作者:行者123 更新时间:2023-12-02 14:01:50 27 4
gpt4 key购买 nike

我试图理解这种函数式响应式(Reactive)编程是如何工作的,但我遇到了一个问题。我正在尝试创建一个 boid simulation ,但我开始慢慢地,我现在已经将 boid 定义为一个函数,它采用起始位置并创建从一个位置到另一个位置的信号函数,其中输入是它移动的点,输出是当前位置:

type Position2 = Vector2 Float

boid :: Position2 -> SF Position2 Position2
boid s = loop (arr (uncurry seek) >>> integral >>> arr (^+^ s) >>> arr dup)

seek 函数需要两个输入(由于循环)。当前位置和目标位置。然后它只是创建一个从当前位置指向目标位置的矢量,其大小为 50,即速度。然后对速度进行积分并添加起始位置。最后信号被分成两部分,因此一个可以成为输出,另一个可以循环回搜索函数。

现在我可以像这样定义 boids:

aBoid = constant (vector2 500 500) >>> (boid (vector2 600 60))
bBoid = aBoid >>> (boid (vector2 3 4))

这里 aBoid 向点 (500, 500) 寻找,bBoid 向 aBoid 寻找。

我的问题是,当我希望两个机器人相互寻找时。当我这样做时:

aBoid = bBoid >>> (boid (vector2 600 60))
bBoid = aBoid >>> (boid (vector2 3 4))

程序只打印:ProgramName: <<loop>>我认为这意味着它进入了无限循环。

我也尝试过使用 par功能如下:

sim :: SF a [Position2]
sim = loop (arr snd >>> par route [boid (vector2 10 10), boid (vector2 100 100)] >>> arr dup)

这里是route函数只是将每个 boid 的输出映射到另一个 boid 的输入(如 zip ,但偏移量为 1)

这也给出了 <<loop>>消息。

我认为在处理响应式(Reactive)系统时,对象依赖于彼此的状态应该是一个非常常见的问题,所以我希望有一些优雅的解决方案。

我应该补充一点,我发现这个 FRP 的东西非常困难并且经常令人困惑,所以我不确定我是否有道理;)

最佳答案

我不太熟悉 Yampa/Animas,但问题本质上似乎是你有一个没有基本情况的递归;您描述了系统的演变,但没有描述它是如何开始的。

怎么样:

aBoid = bBoid >>> boid (vector2 600 60) >>> iPre (vector2 0 0)
bBoid = aBoid >>> boid (vector2 3 4)

这样 aBoid 从 (0,0) 开始,然后反馈循环在下一个瞬间开始?这是假设我对 iPre 的理解是正确的...

(如果您用 (.)((>>>) 的翻转版本)来想象它,管道可能会更容易理解。)

关于haskell - 防止 Yampa/Animas 中 SF 相互依赖的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8649336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com