今天阅读 F#,我不清楚一件事:
来自:http: //msdn.microsoft.com/en-us/library/dd233200.aspx
您只需要元组的一个元素,可以使用通配符(下划线)来避免为不需要的变量创建新名称
让 (a, _) = (1, 2)
我想不出我曾经处于这种情况的时间。为什么要避免创建变量名?
今天阅读 F#,我不清楚一件事:
来自:http: //msdn.microsoft.com/en-us/library/dd233200.aspx
您只需要元组的一个元素,可以使用通配符(下划线)来避免为不需要的变量创建新名称
让 (a, _) = (1, 2)
我想不出我曾经处于这种情况的时间。为什么要避免创建变量名?
因为你不需要价值。我经常用这个。它记录了一个值未使用的事实,并保存了命名变量unused
等dummy
。如果你问我,这是一个很棒的功能。
有趣的问题。这里涉及许多权衡。
您与 Ruby 编程语言进行了比较,因此您应该考虑的第一个权衡可能是静态类型。如果您使用该模式x, _, _
,则 F# 知道您指的是恰好三个元素的三元组的第一个元素,并将在编译时强制执行此约束。鲁比不能。F# 还检查模式的详尽性和冗余性。同样,Ruby 不能。
您的比较也只使用了平面模式。考虑模式_, (x, _)
or x, None | _, Some x
or[] | [_]
等等。这些不是那么容易翻译的。
最后,我要提到的是,标准 ML 是一种与 F# 相关的编程语言,它确实提供了名为#1
etc. 的运算符来提取具有任意数量元素的元组的第一个元素(请参阅此处),因此这个想法已经实现并被抛弃了几十年前。我相信这是因为 SML 的#n
符号在类型系统的约束下最终导致难以理解的错误消息。例如,使用的函数#n
没有明确元组的元组是什么,但函数不能在元组元组上是泛型的,因此这必须导致错误消息指出您必须提供更多类型信息,但许多用户发现这令人困惑。使用 CAML/OCaml/F# 方法就没有这种混淆。
let
您给出的-binding 是一种称为模式匹配的语言工具的示例,它可用于解构许多类型,而不仅仅是元组。在模式匹配中,下划线是表示您不会引用值的惯用方式。
直接访问元组的元素可能更简洁,但不太通用。模式匹配允许您查看某些数据的结构并分派到适当的处理案例。
match x with
| (x, _, 20) -> x
| (_, y, _) -> y
x
仅当第三个元素是 时,此模式匹配才会返回第一项20
。否则返回第二个元素。一旦你超越了琐碎的情况,下划线是一个重要的可读性帮助。将上述内容与以下内容进行比较:
match x with
| (x, y, 20) -> x
| (x, y, z) -> y
在第一个代码示例中,更容易分辨出您关心模式中的哪些绑定。
有时一个方法会返回多个值,但您编写的代码只对其中的几个(或一个)感兴趣。您可以使用多个下划线实质上忽略您不需要的值,而不是让一堆变量在本地范围内徘徊。