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元素。接受你的。谢谢