我正在尝试制作一个输出以下模式的榆树程序:
3 4 2 3 2 4 ...
这是我的榆树代码:
main = lift asText agent
delta = lift (\x -> -1) (fps 1)
agent = foldp update 3 delta
update : Int -> Int -> Int
update x y = x + y + (threshold x)
threshold : Int -> Int
threshold x = if (x < 3) then x
else 0
这就是我认为代码应该说的
3 + -1 + 0 = 2
2 + -1 + 3 = 4
4 + -1 + 0 = 3
3 + -1 + 0 = 2 ... etc
然而,这不是输出。我想我对信号如何更新感到困惑......
答案 0 :(得分:3)
有一些事情会阻止您的代码再次为您3
提供2
然后4
然后3
。 (这不是你在问题开头时所描述的,但是你在结束时就这么说了,所以我将继续这样做。)
update
如果你看一下foldp
的类型,
foldp : (a -> b -> b) -> b -> Signal a -> Signal b
您会注意到,计算的最后一个值是您提供的更新功能的第二个参数。因此,如果您进行update
功能
update y x = x + y + (threshold x)
那么你应该更接近你想要的功能。
threshold
threshold
在x
时返回x < 3
,因此当上一个x
为2
时,它会返回2
,所以你会得到:
3 + -1 + 0 = 2
2 + -1 + 2 = 3
3 + -1 + 0 = 2
2 + -1 + 2 = 3
现在我不确定你之后会怎样,但是如果你向+1
添加threshold
,你应该接近你期望的输出。
通过这些更改,您的代码将如下所示:
main = lift asText agent
delta = lift (\x -> -1) (fps 1)
agent = foldp update 3 delta
update : Int -> Int -> Int
update y x = x + y + (threshold x)
threshold : Int -> Int
threshold x = if (x < 3) then x+1
else 0