cis.upenn.edu cis194 Haskell基础:功能和图片

时间:2017-01-22 08:53:39

标签: haskell

动画

现在交通信号灯是绿色的,但我们希望它不时地切换到红色。 CodeWorld API不仅允许我们绘制图纸,还允许我们运行动画。什么是动画?这是一张随时间变化的图片,时间可以方便地理解为自动画开始以来的秒数。

在命令式语言中,可能会有一个getCurrentTime()函数,并从我们的绘图生成中的某个地方调用它。这在纯函数式语言中是不可能也不可取的,因为它将是隐藏的副作用。相反,时间作为参数提供。

所以这里的代码每三秒钟就会有一次红绿灯开关:

trafficController :: Double -> Picture
trafficController t
  | round (t/3) `mod` 2 == 0 = trafficLight True
  | otherwise                = trafficLight False

main :: IO ()
main = animationOf trafficController

问题:

  1. 如果trafficController语句中的t语句被定义(上面)以使用时间参数,那么函数main如何在没有t语句的情况下工作?
  2. 是什么让offset参数一直递增?

1 个答案:

答案 0 :(得分:1)

  1. animationOf'类型为(Double -> Picture) -> IO ()。这意味着它的参数必须是Double -> Picture类型,即它必须是从DoublePicture的函数。 trafficController是一个具有这种类型的函数。请注意,trafficController t(对于某些Double t)并非如此:它是Picture

  2. animationOf的定义,您可以找到here。如果您查看它对其参数的作用,然后查看它调用的函数等,它最终会反复调用其参数(在本例中为trafficController)并使用不同的t。但是,它需要跟踪几个步骤,我不会在此阶段推荐它。