13

今天阅读 F#,我不清楚一件事:

来自:http: //msdn.microsoft.com/en-us/library/dd233200.aspx

您只需要元组的一个元素,可以使用通配符(下划线)来避免为不需要的变量创建新名称

让 (a, _) = (1, 2)

我想不出我曾经处于这种情况的时间。为什么要避免创建变量名?

4

4 回答 4

16

因为你不需要价值。我经常用这个。它记录了一个值未使用的事实,并保存了命名变量unuseddummy。如果你问我,这是一个很棒的功能。

于 2012-12-31T19:34:30.487 回答
11

有趣的问题。这里涉及许多权衡。

您与 Ruby 编程语言进行了比较,因此您应该考虑的第一个权衡可能是静态类型。如果您使用该模式x, _, _,则 F# 知道您指的是恰好三个元素的三元组的第一个元素,并将在编译时强制执行此约束。鲁比不能。F# 还检查模式的详尽性和冗余性。同样,Ruby 不能。

您的比较也只使用了平面模式。考虑模式_, (x, _)or x, None | _, Some xor[] | [_]等​​等。这些不是那么容易翻译的。

最后,我要提到的是,标准 ML 是一种与 F# 相关的编程语言,它确实提供了名为#1etc. 的运算符来提取具有任意数量元素的元组的第一个元素(请参阅此处),因此这个想法已经实现并被抛弃了几十年前。我相信这是因为 SML 的#n符号在类型系统的约束下最终导致难以理解的错误消息。例如,使用的函数#n没有明确元组的元组是什么,但函数不能在元组元组上是泛型的,因此这必须导致错误消息指出您必须提供更多类型信息,但许多用户发现这令人困惑。使用 CAML/OCaml/F# 方法就没有这种混淆。

于 2013-01-04T00:37:55.923 回答
10

let您给出的-binding 是一种称为模式匹配的语言工具的示例,它可用于解构许多类型,而不仅仅是元组。在模式匹配中,下划线是表示您不会引用值的惯用方式。

直接访问元组的元素可能更简洁,但不太通用。模式匹配允许您查看某些数据的结构并分派到适当的处理案例。

match x with
| (x, _, 20) -> x
| (_, y, _)  -> y

x仅当第三个元素是 时,此模式匹配才会返回第一项20。否则返回第二个元素。一旦你超越了琐碎的情况,下划线是一个重要的可读性帮助。将上述内容与以下内容进行比较:

match x with
| (x, y, 20) -> x
| (x, y, z)  -> y

在第一个代码示例中,更容易分辨出您关心模式中的哪些绑定。

于 2012-12-31T20:18:37.517 回答
2

有时一个方法会返回多个值,但您编写的代码只对其中的几个(或一个)感兴趣。您可以使用多个下划线实质上忽略您不需要的值,而不是让一堆变量在本地范围内徘徊。

于 2012-12-31T19:34:37.630 回答