parameters - 为什么此 F# 函数的参数值似乎变为 0?

标签 parameters f# matching

我正在尝试编写一个递归函数来构建一个专门的卡片组。第一个参数 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/

相关文章:

delphi - delphi SDI中创建新表单时传递参数

vb.net - 如何将子过程作为参数传递 VB.NET

parameters - 是否可以以某种方式创建类似 typeof 的函数

search - ElasticSearch问题与匹配结果

c++ - 使 GUI 从 Windows 命令行运行

optimization - 延续+尾递归技巧是否真的用堆栈空间交换堆空间?

list - 将项目列表分为两个奇数和偶数索引项目列表

generics - 试图理解 F# 中的 Choice 类型

python - 在 Python 中实现比较类的 OOP 方法

python - 人员匹配程序或算法