Доступ к нескольким структурам данных

#haskell #data-structures #functional-programming

#haskell #структуры данных #функциональное программирование

Вопрос:

Я пишу текстовую приключенческую игру на Haskell для опыта после прочтения LYAH, но мне нужна помощь в написании функции, в которой осуществляется доступ к двум структурам данных (в данном случае к двум игрокам) и возвращается другая структура (другой [атакованный] игрок). Спасибо!

 data Player = Player { name :: String
                 , hp :: Int
                 , atk :: Int
                 , def :: Int
                 , spd :: Int
                 } deriving (Show, Eq)

data Qstat = Qstat Int Int Int Int

lv :: Qstat
lv = Qstat 1 1 1 1

describe :: Player -> String
describe (Player {name = n, hp = h, atk = a, def = d, spd = s}) 
    =    "Name: "     n
         ", HP: "     (show h)
         ", ATK: "    (show a)
         ", DEF: "    (show d)
         ", SPD: "    (show s)

promote :: Qstat -> Player -> Player
promote (Qstat w x y z) (Player {name = n, hp = h, atk = a, def = d, spd = s})
    = Player n (h   w) (a   x) (d   y) (s   z)

gets :: Player -> Qstat
gets (Player {name = n, hp = h, atk = a, def = d, spd = s})
    = Qstat n h a d s

attack :: Player -> Player -> Player
attack = --how can I access the stats of both players (preferably without do notation)
  

Комментарии:

1. Точно так же, как вы делали это раньше? attack (Player {name = n, hp = h, atk = a, def = d, spd = s}) ...

2. Большинство руководств и книг по Haskell не являются полностью полными. Вы должны учиться по крайней мере из двух источников.

Ответ №1:

Сопоставление с шаблоном или любым из (многих) других способов, которыми вы можете написать функцию с двумя аргументами? Кроме того, у вас есть различный синтаксис, который доступен только для типов записей.

 attack :: Player -> Player -> Player
attack aggressor defender = victim { hp = max 0 $ hp victim - dmg }
 where
    aQual = atk aggressor   spd aggressor
    dQual = def defender   spd defender
    (victor, victim) = case compare aQual dQual of
     LT -> (defender, aggressor)
     _  -> (aggressor, defendor)
    dmg = max 1 $ atk victor - def victim
  

Пожалуйста, проведите исследование перед публикацией на SO. 3 «стандартных» текста для начинающих уже объясняют это.