代码之家  ›  专栏  ›  技术社区  ›  Søren Debois

F中的元组与*星型#

  •  1
  • Søren Debois  · 技术社区  · 4 年前

    考虑下面的代码:

    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 * string System.Tuple<int * string> ?

    对于2来说,至少后者有 null 作为一种价值观(这个问题就是这样产生的)。还有其他区别吗?

    0 回复  |  直到 4 年前
        1
  •  5
  •   Sergey Berezovskiy    4 年前

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

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

    在第一种情况下,只需调用一个带有两个参数的方法。那么第二个呢 元组。创造 超载显然是被选中的。毫不奇怪。

    但是使用管道,首先要创建一个元组实例。然后把它传给 元组。创造 方法第二个例子就是这样

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

    只有一个论点 元组。创造 超负荷将被选中。

    注: 星型 这是一种方式 tuple type names 都是用F#写的。所以 Tuple<int, string, bool> (int * string * bool) .这是一样的。

        2
  •  4
  •   nilekirk    4 年前

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

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

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

    所以 一对 有类型 System.Tuple<int,string> (这与 int * string ),但tuple有类型 System.Tuple<System.Tuple<int,string>> (这是 System.Tuple<int * string> )