在F#中输入推理和新内容

Tor*_*ing 6 f# f#-interactive

使用F#2.0和FSI我有以下内容:

let foo = List(xs)//works
let bar = new List(xs) //need type parameter 'The type System.Collectsion.Generic<_> expects 1 type argument 0 was given
Run Code Online (Sandbox Code Playgroud)

我当然可以这样做:

let baz = new List<TypeOItemsInXs>(xs)//why?
Run Code Online (Sandbox Code Playgroud)

现在有合理的事情吗?为什么我必须在工作类型推断或警告免费代码之间进行选择(如果'List'是一次性的,你会得到一个警告,你应该使用'new'来明确它).

任何解决方法?这是一个错误还是什么?

Yin*_*Zhu 13

您仍然可以使用带有通配符的类型推断_:

open System.Collections.Generic
let xs = [1;2;3]

let bar = new List<_>(xs)
Run Code Online (Sandbox Code Playgroud)

BTW,区分F#列表和.NET List<T>的容器中,F#已经改名为.NET List<T>ResizeArray<T>,这是在Microsoft.FSharp.Collections这个命名空间,默认打开:

let bar2 = new ResizeArray<_>(xs)
Run Code Online (Sandbox Code Playgroud)


Rob*_*ert 8

尹朱答案是对的,我想补充一个细节.在F#中,您可以使用或不使用new关键字来调用.NET构造函数.如果new省略,则不需要添加泛型参数,但是如果使用new则必须添加泛型参数,即使您让类型推断使用通配符执行工作也是如此_.

因此,你可以说:

> ResizeArray([1; 2; 3;]);;
val it : System.Collections.Generic.List<int> = seq [1; 2; 3]
Run Code Online (Sandbox Code Playgroud)

要么

> new ResizeArray<_>([1; 2; 3;]);;
val it : ResizeArray<int> = seq [1; 2; 3]
Run Code Online (Sandbox Code Playgroud)

但不是:

> new ResizeArray([1; 2; 3;]);;

  new ResizeArray([1; 2; 3;]);;
  ----^^^^^^^^^^^

C:\Temp\stdin(5,5): error FS0033: The type 'Microsoft.FSharp.Collections.ResizeArray<_>' expects 1 type argument(s) but is given 0
Run Code Online (Sandbox Code Playgroud)