Я пытаюсь повернуть изображение в Haskell, используя текущее время в качестве значения для функции поворота. У меня есть такая main
функция:
main :: IO ()
main = do
args <- getArgs
time <- round <$> getPOSIXTime
let initial' = initial time
let (w, h, display) = chooseDisplay args
let background = black
let fps = 60
play display background fps initial' (draw w h) eventHandler timeHandler
Треугольник (= player) хранится внутри типа данных World: module Model, где
data World = World {
-- all kinds of World properties --
player :: Picture
}
Затем у меня есть функция initial
, которая инициализирует мир, и функция playerBody
, которая, учитывая значение поворота, возвращает изображение player
:
initial :: Int -> World
initial _ = World{player = playerBody 0}
playerBody :: Float -> Picture
playerBody rot = Rotate rot $ color red $ Polygon[(-10, 100), (10, 100), (0, 125)]
Функция рисования определяется следующим образом:
draw :: Float -> Float -> World -> Picture
draw _ _ world = player world
В настоящее время он просто возвращает player
Picture.
Теперь в моем модуле timeHandler я хочу использовать время (заданное timeHandler в функции main
) для поворота player
следующим образом:
timeHandler :: Float -> World -> World
timeHandler time = (\world -> world {player = playerBody time} )
Это не работает. Я заменил time
постоянным значением (в функции timeHandler), и это действительно повернуло изображение. Похоже, time
не обновляется .. что я делаю не так?
time
вmain
иtime
вtimeHandler
не имеют ничего общего друг с другом - фактически, у них даже нет одного и того же типа. Первое - это локальное значение, полученное при выполненииgetPosixTime
, а второе - параметр в независимом определении функции. Просто у них одно и то же имя. - person duplode   schedule 22.10.2016play
,timeHandler
следует указывать время в секундах. - person Felix   schedule 22.10.2016main
, меня немного смутила. (Вы сами не передаетеtime
в `timeHandler`; скорее, Gloss сам подбирает его где-нибудь в реализацииplay
.) - person duplode   schedule 22.10.2016draw
делает? Вы должны включить весь свой код. Также этот пример не кажется минимальным -seed
не используется вinitial
, поэтому вам нужно просто удалить его. Сведение к минимуму примера может помочь вам увидеть ошибку. - person user2407038   schedule 22.10.2016