繁体   English   中英

Tuple.Create in F#

[英]Tuple.Create in F#

我注意到F#中的System.Tuple.Create方法有一种非常奇怪的行为。 查看MSDN文档时,它表明返回类型是System.Tuple<T> 但是在F#中使用此方法时,除Tuple.Create(T)之外的所有重载都将返回'T1 * 'T2 显然,调用Tuple<T>构造函数将返回Tuple<T> 但是我不明白Tuple.Create的返回类型在F#中有何不同。

元组类型的F#(语法元组)编译为System.Tuple<..> 因此它们在.NET级别是相同的类型,但对于F#类型系统,它们是不同的类型:语法元组的类型将与System.Tuple<..>的类型不匹配,但它们的运行时类型将是相同的。

您可以在F#规范中找到详细说明

使用new System.Tuple<'t>()的示例不会返回语法元组,可能是因为您明确地实例化了特定类型,并且您应该准确地回复它。

以下是一些测试:

let x = new System.Tuple<_,_>(2,3) // Creates a Tuple<int,int>
let y = System.Tuple.Create(2,3)   // Creates a syntactic tuple int * int

let areEqual = x.GetType() = y.GetType() // true

let f (x:System.Tuple<int,int>) = ()
let g (x:int * int) = ()

let a = f x
let b = g y

// but

let c = f y 
//error FS0001: The type 'int * int' is not compatible with the type 'Tuple<int,int>'

let d = g x
// error FS0001: This expression was expected to have type int * int but here has type Tuple<int,int>  

因此,在编译时它们是不同的,但在运行时它们是相同的。 这就是为什么当你使用.GetType()你会得到相同的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM