为什么这个榆树代码不起作用? (提供预期输出的示例)

时间:2014-04-13 03:27:08

标签: elm

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

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

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

1 个答案:

答案 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

的含义

thresholdx时返回x < 3,因此当上一个x2时,它会返回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