F# 将元组元素与“匹配”;作为「;图案
我想将具有相同类型的两个元素的元组转换为列表。代码看起来很简单,如下所示:F# 将元组元素与“匹配”;作为「;图案,f#,F#,我想将具有相同类型的两个元素的元组转换为列表。代码看起来很简单,如下所示: let toList (tuple: 'a * 'a): 'a list = match tuple with | (_ as fst, _ as snd) -> [fst; snd] 但不知何故,snd的类型是'a*'a,因此似乎不是将元组的第二个元素绑定到变量,而是绑定整个元组。这是编译器中的错误还是我遗漏了什么 实际的代码更复杂,所以我们的想法不是重写提供的代码,而是理解这里使用的as有什么
let toList (tuple: 'a * 'a): 'a list =
match tuple with
| (_ as fst, _ as snd) -> [fst; snd]
但不知何故,snd
的类型是'a*'a
,因此似乎不是将元组的第二个元素绑定到变量,而是绑定整个元组。这是编译器中的错误还是我遗漏了什么
实际的代码更复杂,所以我们的想法不是重写提供的代码,而是理解这里使用的
as
有什么问题。我希望as
应该跟在元组后面,把它作为一个整体绑定起来,就像这样|(u作为fst,u作为snd)作为元组一样as>模式的正确语法形式是
身份
这将ident定义为与模式输入相等,并与模式输入匹配
反对帕特
对于您的代码,这意味着
let toList (tuple: 'a * 'a): 'a list =
match tuple with
| (fst, snd) -> [fst; snd]
其中,(fst,snd)
是一种元组模式
有关“as”模式的详细信息,请参见第7.3节。出于实际目的@nilekirk的答案更好:在这种特殊情况下,您根本不需要as
但是,如果您想知道为什么snd
有这种类型用于学习目的,这里有一个解释
您的模式编译如下:
| ((_ as fst, _) as snd) ->
也就是说,元组绑定比模式别名更强
如果希望将每个作为应用于元组的单个元素,则需要明确告诉编译器如何将它们括起来:
| ((_ as fst), (_ as snd)) ->
顺便说一句,在F#tuple中不必有parens,因此不需要外部parens:
| (_ as fst), (_ as snd) ->
正如我提到的,将代码重写为其他形式并不是我所需要的,因为实际上它更复杂:使用标识符模式,我需要检查DU类型,同时提取tuple元素。接受你的。谢谢