现在交通信号灯是绿色的,但我们希望它不时地切换到红色。 CodeWorld API不仅允许我们绘制图纸,还允许我们运行动画。什么是动画?这是一张随时间变化的图片,时间可以方便地理解为自动画开始以来的秒数。
在命令式语言中,可能会有一个getCurrentTime()
函数,并从我们的绘图生成中的某个地方调用它。这在纯函数式语言中是不可能也不可取的,因为它将是隐藏的副作用。相反,时间作为参数提供。
所以这里的代码每三秒钟就会有一次红绿灯开关:
trafficController :: Double -> Picture
trafficController t
| round (t/3) `mod` 2 == 0 = trafficLight True
| otherwise = trafficLight False
main :: IO ()
main = animationOf trafficController
trafficController
语句中的t
语句被定义(上面)以使用时间参数,那么函数main
如何在没有t
语句的情况下工作?offset
参数一直递增?答案 0 :(得分:1)
animationOf
'类型为(Double -> Picture) -> IO ()
。这意味着它的参数必须是Double -> Picture
类型,即它必须是从Double
到Picture
的函数。 trafficController
是一个具有这种类型的函数。请注意,trafficController t
(对于某些Double
t
)并非如此:它是Picture
!
animationOf
的定义,您可以找到here。如果您查看它对其参数的作用,然后查看它调用的函数等,它最终会反复调用其参数(在本例中为trafficController
)并使用不同的t
。但是,它需要跟踪几个步骤,我不会在此阶段推荐它。