【问题标题】:Tuple vs * star types in F#F# 中的元组与 * 星型类型
【发布时间】:2021-01-12 14:29:08
【问题描述】:

考虑以下代码:

let pair = System.Tuple.Create (10, "foo")       // val pair : int * string = (10, "foo")
let tuple = System.Tuple.Create <| (10, "foo")   // val tuple : System.Tuple<int * string> = ((10, "foo"))
  1. 为什么这两行不产生相同类型的值?参数(10, "foo") 的类型是否在这两行之间发生了某种变化?
  2. int * stringSystem.Tuple&lt;int * string&gt; 之间的确切区别是什么?

对于 2,至少后者有 null 作为值(这就是这个问题的提出方式)。还有其他区别吗?

【问题讨论】:

    标签: f# tuples


    【解决方案1】:

    Tuple.Create 有两种不同的重载:

     Tuple.Create<'T1>(item1: 'T1)
     Tuple.Create<'T1, 'T2>(item1: 'T1, item2: 'T2)
     
    

    在第一种情况下,您只需调用带有两个参数的方法。所以显然选择了第二个Tuple.Create 重载。不足为奇。

    但是使用管道,您首先创建一个元组实例。然后将其传递给Tuple.Create 方法。这就是第二个示例中发生的情况

      let intermediate : Tuple<int, string> = (10, "foo")
      let tuple = Tuple.Create(intermediate)
    

    使用单个参数,将选择第一个 Tuple.Create 重载。

    注意:星型tuple type names 用 F# 编写的一种方式。所以Tuple&lt;int, string, bool&gt; 将是(int * string * bool)。都是一样的。

    【讨论】:

    • 您写道,在第一种情况下,使用两个参数调用方法。但是它不是用一个元组类型的参数调用的吗?否则我会期待Tuple.Create 10 "foo"
    【解决方案2】:

    您的 tuple 是一 (1) 个元素的元组,即元组 10,"foo"。相当于

    System.Tuple.Create(System.Tuple.Create(10, "foo"))
    

    另一方面,您的 pair 是两个元素 10 和“foo”的元组。

    所以pair 的类型为System.Tuple&lt;int,string&gt;(与int * string 相同),但元组的类型为System.Tuple&lt;System.Tuple&lt;int,string&gt;&gt;(即System.Tuple&lt;int * string&gt;

    【讨论】:

      猜你喜欢
      • 2014-03-19
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      相关资源
      最近更新 更多