我正在尝试编写一个递归函数来构建一个专门的卡片组。第一个参数 numOfCards 应该是一副牌中的牌数。 sourceDeck 是可用于构建牌组的可能卡片列表,而 currentDeck 是我的累加器,它会生成最终的卡片列表。
但是,我遇到的问题是,当我为 numOfCards 发送一个数值时,它在匹配语句中被设置为 0。或者至少看起来是这样。我尝试使用调试器单步执行,当我输入函数时,值是正确的。然而,一旦我开始执行匹配,它突然变成 0,如果我将鼠标悬停在匹配中的值和参数中的值(至少是一致的)上。
因此,匹配在 0 时触发并只返回空的 currentDeck,而不是迭代。
关于这个有什么建议吗?可能很简单,但我很难过。 :)
let rec buildDungeon (numOfCards, sourceDeck : List<Card>, currentDeck : List<Card>) =
match currentDeck.Length with
| numOfCards -> currentDeck
| _ -> buildDungeon (numOfCards, sourceDeck, newCard(sourceDeck)::currentDeck)
最佳答案
如果你想处理 currentDeck.Length
equals numOfCards
那么你需要写:
let rec buildDungeon (numOfCards, sourceDeck : List<Card>, currentDeck : List<Card>) =
match currentDeck.Length with
| n when n = numOfCards -> currentDeck
| _ -> buildDungeon (numOfCards, sourceDeck, newCard(sourceDeck)::currentDeck)
问题是当你写一个子句| numOfCards -> (...)
,模式匹配将 currentDeck.Length
的值绑定(bind)到符号 numOfCards
(以及新定义的 numOfCards
value 隐藏了之前的同名值——也就是你作为参数得到的值)。
我上面写的模式匹配将 currentDeck.Length
绑定(bind)到一个新符号 n
然后检查 n = numOfCards
(指作为参数传递的 numOfCards
)。
因此,模式匹配并不是真正检查相等性的最佳工具 - 使用普通的 if
可能更容易编写您的代码:
let rec buildDungeon (numOfCards, sourceDeck : List<Card>, currentDeck : List<Card>) =
if currentDeck.Length = numOfCards then currentDeck
else buildDungeon (numOfCards, sourceDeck, newCard(sourceDeck)::currentDeck)
关于parameters - 为什么此 F# 函数的参数值似乎变为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503938/