LINUX.ORG.RU

[Haskell] Хочется состояния =)

 


0

0

Господа хаскелисты, как быть в таких ситуациях, когда наличие состояния фактически диктуется условиями задачи?

Например в игре это здоровье, положение на карте, патроны итд... Про монады State и IO я знаю, но при попытке упаковать состояние в какой-то тип, напарываюсь на проблему изменения лишь одного параметра.

Изучал по этому поводу чужие исходники и увидел такие вот жуткие вещи:

type GameState = (Tick, Gun, Bullets, Invaders, Bullets, Explosions, Score, Lives, Level)

getScore :: GameState -> Score

getScore (_, _, _, _, _, _, s, _, _) = s

modifyScoreInState :: GameState -> Score -> GameState

modifyScoreInState (tick, gun, gunBullets, invaders, invBullets, explosions, oldScore, lives, level) newScore

= (tick, gun, gunBullets, invaders, invBullets, explosions, newScore, lives, level)

Но что-то мне подсказывает, что это не найлучший подход. Тем более, если мне понадобится добавить параметр, то придется все переписывать =/

★★★★★

man record syntax

простой рабочий пример:

module Main where

data GameState = GameState {
      gunBullets :: Int
    , invBullets :: Int
    , explosions :: Bool
    , score :: Int} deriving (Show) 

state1 = GameState {gunBullets = 10, invBullets = 100, explosions = True, score = 50}

getScore state = score state
modifyScoreInState state newScore = state {score = newScore}

main = do
    let state2 = modifyScoreInState state1 100
    putStrLn $ show $ getScore state2

yet_another_lor_account
()
Ответ на: комментарий от yet_another_lor_account

Спасибо, понял я уже =)

Я не знал конкретно про такую запись:

modifyScoreInState state newScore = state {score = newScore}

Waterlaz ★★★★★
() автор топика
Ответ на: комментарий от yet_another_lor_account

man point free style

<getScore state = score state
>getScore = score

imp ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.