函数式编程 - 倒计时时避免让我的变量可变

Functional Programming - Avoid making my variable mutable when counting it down

首先让我感谢你昨天的回复。我能够继续。

我目前的问题是我已经能够避免使所有变量可变,除了 Pokemon 的 currentHP。 先是我的战斗代码,后面是解释。

let angriffFighter(fighterPair:list<Domain.Pokemon>) =
    let dmg = hit fighterPair.[0] fighterPair.[1]
    fighterPair.[1].currentHP <- fighterPair.[1].currentHP-dmg

函数“hit”计算处理的 dmg 和 returns 一个整数。 currentHP 是我似乎无法使其不可变的唯一剩余变量。 我需要在每个战斗中减少它,我希望它在战斗后重置为 maxHP。

我该如何解决这个问题?

使用 copy-and-update expression 到 return 具有更改字段的新记录值:

let angriffFighter (fighterPair : list<Domain.Pokemon>) =
    let dmg = hit fighterPair.[0] fighterPair.[1]
    let new1 = { fighterPair.[1] with currentHP = fighterPair.[1].currentHP - dmg }
    [ fighterPair.[0]; new1 ]

但实际上,与其将列表成对传递,不如使用一对(元组)更容易:

let angriffFighter (x, y) =
    let dmg = hit x y
    x, { y with currentHP = y.currentHP - dmg }

此版本将一个元组作为输入,并且 return 是一个相同类型的元组。更简单、更安全,因为有了元组,您知道第一个和第二个元素将在那里。这与列表相反,在列表中索引(使用 .[0].[1] 等)是不安全的,因为您不知道那里是否会有一个元素指数.