类型推断&新的F#

时间:2011-06-16 11:57:01

标签: 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

现在我当然可以这样做:

let baz = new List<TypeOItemsInXs>(xs)//why?

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

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

2 个答案:

答案 0 :(得分:13)

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

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

let bar = new List<_>(xs)

顺便说一句,要区分F#list和.NET List<T>容器,F#已将.NET List<T>重命名为ResizeArray<T>,它位于Microsoft.FSharp.Collections中,并且此命名空间已打开默认情况下:

let bar2 = new ResizeArray<_>(xs)

答案 1 :(得分:8)

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

因此,您可以说:

_

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

但不是:

> new ResizeArray<_>([1; 2; 3;]);;
val it : ResizeArray<int> = seq [1; 2; 3]
相关问题