Generics 具有泛型类型和静态成员的意外编译器警告
我想创建自己的列表类型Generics 具有泛型类型和静态成员的意外编译器警告,generics,f#,Generics,F#,我想创建自己的列表类型CountedList;计数=0} 成员this.AddOne(element)={this with List=element::this.List;Count=this.Count+1} 其思想是从一个CountList开始。清空某个类型,然后通过AddOne方法添加一个元素 但是,当我尝试使用以下内容创建空列表时: let emptyDoubleList = CountedList.Empty<double>() let emptyDoubleL
CountedList;计数=0}
成员this.AddOne(element)={this with List=element::this.List;Count=this.Count+1}
其思想是从一个CountList开始。清空某个类型,然后通过AddOne方法添加一个元素
但是,当我尝试使用以下内容创建空列表时:
let emptyDoubleList = CountedList.Empty<double>()
let emptyDoubleList=CountedList.Empty()
我得到以下警告:
The instantiation of the generic type 'CountedList' is missing and can't be inferred from the arguments or return type of this member. Consider providing a type instantiation when accessing this type, e.g. 'CountedList<_>'.
缺少泛型类型“CountedList”的实例化,并且无法从此成员的参数或返回类型推断。考虑在访问此类型时提供类型实例化,例如“COUNTEDLIST”。
但直接这样做:
let directEmptyDoubleList = {List=List.empty<double>; Count=0}
让directEmptyDoubleList={List=List.empty;Count=0}
不发出警告
为什么我会收到这个警告?编译器不应该意识到它是一个CountedList吗?此外,对于如何改进CountedList实施的任何建议,我们也将不胜感激
以下是完整的代码示例:
type CountedList<'T> = {List: 'T list; Count: int}
static member Empty<'a> () = {List=List.empty<'a>; Count=0}
member this.AddOne(element) = {this with List=element::this.List; Count=this.Count + 1}
let emptyDoubleList = CountedList.Empty<double>() //Why does this give me a warning??
let directEmptyDoubleList = {List=List.empty<double>; Count=0}
类型CountedList;计数=0}
成员this.AddOne(element)={this with List=element::this.List;Count=this.Count+1}
let emptyDoubleList=CountedList.Empty()//为什么这会给我一个警告??
让directEmptyDoubleList={List=List.empty;Count=0}
这是因为Empty
方法的类型参数不必与CountedList
类的类型参数匹配。因此,CountedList.Empty()
是一个有效的方法调用,它将返回一个CountedList
,编译器无法确定这是否是您想要的
您可能希望将
Empty
设为非泛型方法,并使用List.Empty这是因为Empty
方法的类型参数不必与CountedList
类的类型参数相匹配。因此,CountedList.Empty()
是一个有效的方法调用,它将返回一个CountedList
,编译器无法确定这是否是您想要的
您可能希望将Empty
设为非泛型方法,并使用List。Empty我很惊讶编译器没有意识到本例中CountedList
的类型并不重要,只有Empty
命令中的类型才重要。谢谢你的解释。我很惊讶编译器没有意识到本例中CountedList
的类型并不重要,只有Empty
命令中的类型才重要。谢谢你的解释。
type CountedList<'T> = {List: 'T list; Count: int}
static member Empty<'a> () = {List=List.empty<'a>; Count=0}
member this.AddOne(element) = {this with List=element::this.List; Count=this.Count + 1}
let emptyDoubleList = CountedList.Empty<double>() //Why does this give me a warning??
let directEmptyDoubleList = {List=List.empty<double>; Count=0}