#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 «стандартных» текста для начинающих уже объясняют это.