В настоящее время я пытаюсь разработать крошечную игру Conway of Life в Хаскелле. Я написал библиотеку, lifegame, которая позволяет управлять сеткой ячеек и вычислять ее поколения (см. github.com/qleguennec/lifegame.git). Поколения - это бесконечный список. Пока библиотека работает отлично, но не хватает документации. Это небольшая библиотека, и в нее не должно быть так сложно.
Теперь, для чего я здесь, я пытаюсь использовать lifegame в сочетании с рулем, чтобы на самом деле показать поколениям на экране. Вот что я написал:
import FRP.Helm
import FRP.Helm.Graphics (Element(..))
import qualified FRP.Helm.Window as Window
import FRP.Helm.Animation (Frame, AnimationStatus(..), animate, absolute)
import FRP.Helm.Time (second, running, delta)
import FRP.Elerea.Simple
import Cell.Display (allGenFrames)
import LifeGame.Data.CellGrid (CellGrid(..), randCellGrid)
render :: Form -> (Int, Int) -> Element
render form (x, y) = collage x y $ [form]
main :: IO ()
main = do
cg <- randCellGrid 50 50
anim <- return . absolute $ allGenFrames cg (1 * second) 10
engine <- startup defaultConfig
run engine $ render <~ (animate anim running status) ~~ Window.dimensions engine
where
config = defaultConfig { windowTitle = "bats"
, windowDimensions = (500, 500)}
status = effectful $ getLine >>= \i -> return $
case i of
"Pause" -> Pause
"Stop" -> Stop
"Cycle" -> Cycle
(from: github.com/qleguennec/bats.git)
Тяжелая работа вычислений живет в строке animate running status
", строка 20. Я не совсем понимаю, что такое второй аргумент анимации. Кроме того, я не уверен, что подача бесконечного списка фреймов является законным.
Когда я запускаю код, игра замерзает и останавливается через 5 минут. Кажется, он потребляет всю память и краш. Теперь я понимаю, что все это не хватает документации. Я работаю над этим. Но, будучи ребенком Хаскеллером и разработчиком FRP/SDL для детей, мне нужно знать, буду ли я делать это неправильно (и, вероятно, я это делаю). Любые комментарии принимаются и рекомендуются. Спасибо.