【问题标题】:Accessing multiple data structures访问多个数据结构
【发布时间】:2014-07-04 16:53:28
【问题描述】:

在阅读 LYAH 后,我正在用 Haskell 编写一个基于文本的冒险游戏以获得经验,但我需要帮助编写一个函数,在该函数中访问两个数据结构(在本例中为两个玩家)和另一个结构(另一个 [被攻击] 玩家) 被退回。谢谢!

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)

【问题讨论】:

  • 和以前一样吗? attack (Player {name = n, hp = h, atk = a, def = d, spd = s}) ...
  • 大多数 Haskell 教程和书籍并不完全完整。您应该至少从两个来源中学习。

标签: haskell data-structures functional-programming


【解决方案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 个“标准”初学者文本已经解释了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多