Để lặp lại một trong những dấu ngoặc kép yêu thích của tôi
... mất trong trạng thái của thế giới và trả về một thế giới mới, do đó còn tinh khiết.
Điều này đã nói về Clean, một người anh em họ của Haskell nhưng nó vẫn liên quan. Ý chính của nó là, bạn nói đúng, bạn cần một loại trạng thái nào đó, nhưng nó không phải là có thể thay đổi được. Hãy xem xét
myFun :: StateOfTheWorld -> a -> (StateOfTheWorld, b)
vì vậy chúng tôi không sửa đổi trạng thái, chúng tôi chỉ tạo một hình mới. Điều này có tính minh bạch liên quan, vì được đưa ra cùng một trạng thái của thế giới và cùng một hành động, bạn sẽ nhận được cùng một điều trở lại.
Đối với bạn, bạn có thể có một cái gì đó giống như
killPlayer :: Game -> Event -> Game
killPlayer g (Kill x) = g { isDead = x : isDead g }
mà chỉ được sử dụng cập nhật chức năng cho hồ sơ. Đây là một chút klunky, vì vậy chúng tôi có thể làm điều gì đó như
killPlayer :: Game -> Event -> Action
killPlayer (PlayerDamaged x amount) = if playerHealth g x <= amount
then KillPlayer x
else ReduceHealth x amount
Vì vậy, chúng tôi chỉ trả lại sự khác biệt, không phải trạng thái trò chơi đầy đủ.
Công trình này, nhưng rất xấu. Vì vậy, chúng tôi prettify này với ký hiệu do
và Control.Monad.State. Điều này nghe có vẻ đáng sợ nhưng đó là chính xác những gì chúng tôi đã làm ở trên, chỉ với một chút trừu tượng cú pháp. Trên thực tế, đây cũng là điều mà IO
cũng có trên GHC. Tôi không biết nếu bạn đã học về Monads, nhưng các đơn vị nhà nước thường là ví dụ thúc đẩy.
Cuối cùng để quay lại trò chơi, nhiều trò chơi tôi đã thấy như thế này: đống những thứ lắng nghe sự kiện và sau đó gợi ý một số thay đổi nhỏ về trạng thái trò chơi và trả lại sự khác biệt các cuộc gọi OpenGL thích hợp hoặc bất kỳ điều gì để thực hiện những thay đổi đó.
Trong Haskell, bạn có thể sử dụng đơn vị trạng thái. – Jocke
Bạn đã thấy vô số câu hỏi khác về FP và tiểu bang chưa? Một số người trong số họ thậm chí còn được liệt kê bên phải trong "Liên quan". TL, DR - Có trạng thái ổn, không có trạng thái nào có thể thay đổi được. (Các đơn vị 'State' được đề cập ở trên không phải là ma thuật, nó chỉ là ba mươi dòng mã thư viện.) – delnan
Sử dụng" State monad "(googlable), vâng. Về cơ bản nó chỉ là 'gõ State s a = s -> (a, s)' với 'Monad' & co thể hiện. Để có ví dụ "trò chơi" thuần khiết, hãy xem http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html. – JJJ