像往常一样,F# 规范来救援:
6.3.2 元组表达式
expr1, ..., exprn 形式的表达式是元组表达式。例如:
let three = (1,2,"3")
let blastoff = (10,9,8,7,6,5,4,3,2,1,0)
对于新类型 ty1 ... tyn,表达式的类型为 (ty1 * ... * tyn),并且使用初始类型 tyi 检查每个单独的表达式 ei。
元组类型和表达式被转换为名为 System.Tuple 的 F# 库类型系列的应用程序。元组类型 ty1 * ... * tyn 翻译如下:
- 对于 n Tuple<ty1,...,tyn>.
- 对于较大的 n,元组类型是附加 F# 库类型的应用程序的简写
System.Tuple<_>
如下:
- 对于 n = 8,详细形式为
Tuple<ty1,...,ty7,Tuple<ty8>>
.
- 对于 9 Tuple<ty1,...,ty7,tyB>其中 tyB 是类型的转换形式 (ty8... tyn).
元组表达式 (expr1,...,exprn) 翻译如下:
- 对于 n new Tuple<ty1,…,tyn>(expr1,...,exprn).
- 对于 n = 8 的详细形式
new Tuple<ty1,…,ty7,Tuple<ty8>>(expr1,...,expr7, new Tuple<ty8>(expr8)
.
- 对于 9 new Tuple<ty1,...ty7,ty8n>(expr1,..., expr7, new ty8n(e8n)其中 ty8n 是类型 (ty8*...* tyn),expr8n 是表达式的详细形式
expr8,...,exprn。
当被视为静态类型时,元组类型与其编码形式不同。但是,元组值和类型的编码形式在 F# 类型系统中通过运行时类型可见。例如,typeof 相当于typeof<System.Tuple<int,int>>
,并且 (1,2) 具有运行时类型System.Tuple<int,int>
。同样,(1,2,3,4,5,6,7,8,9) 具有运行时类型Tuple<int,int,int,int,int,int,int,Tuple<int,int>>
.
注意:在 .NET 4.0 F# 中将元组添加到 BCL 之前,使用 FSharp.Core dll 中定义的 System.Tuple 类型
我想您处理任意大小的元组的唯一方法是使用以下函数进行构造和解构:Microsoft.FSharp.Reflection.FSharpType\FSharpValue