1

我正在尝试制作一个输出以下模式的榆树程序:

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

然而,这不是输出。我想我对信号如何更新感到困惑......

4

1 回答 1

3

有一些事情让你的代码不能再给你,3然后2再给你。(这与您在问题开始时所描述的不完全一样,但您在结束时会这样做,所以我会继续这样做。)43

参数顺序update

如果您查看 的类型foldp

foldp : (a -> b -> b) -> b -> Signal a -> Signal b

您会注意到计算的最后一个值是您提供的更新函数的第二个参数。所以如果你让你的update功能

update y x = x + y  + (threshold x)

那么你应该更接近你想要的功能。

的意思threshold

threshold返回xwhen x < 3,所以当最后一个xwas时2,它会返回2,所以你会得到:

3 + -1 + 0 = 2
2 + -1 + 2 = 3
3 + -1 + 0 = 2
2 + -1 + 2 = 3

现在我不确定你在追求什么,但如果你添加一个+1threshold你应该接近你期望的输出。

结论

通过这些更改,您的代码将如下所示:

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
于 2014-04-13T20:40:22.233 回答