gpt4 book ai didi

.net - 在 F# 中创建元组

转载 作者:行者123 更新时间:2023-12-05 00:24:03 25 4
gpt4 key购买 nike

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

最佳答案

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

您可以在 F# spec 中找到详细说明。

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() 时你得到相同的结果。

关于.net - 在 F# 中创建元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27232736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com