【发布时间】:2017-01-19 16:01:31
【问题描述】:
我在 F# 中有一个具有单个类型参数的泛型类,并且想创建一个包含工厂方法的静态类。当我编写我的类时,F# 编译器会生成一个与“类型变量超出其范围”相关的错误。我的问题是为什么会出现错误以及如何解决它。
我创建了一个最小尺寸的 sn-p 来演示这个问题:
type Foo<'a>(element : 'a) =
member this.Copy () = Bar.Create(element)
and Bar =
static member Create(element : 'a) = new Foo<'a>(element)
类型之间存在相互递归,因为我希望类型Foo<'a> 能够调用静态类中的工厂方法。上面的 sn -p 没有编译,错误是:“类型推断导致类型变量 a 逃逸了它的范围。考虑添加显式类型参数声明或调整你的代码不那么通用。”该错误被注册为位于Bar 类的Create 方法中。不幸的是,我并不真正理解这个问题,也不知道如何解决它。有什么想法吗?
这里有一个额外的观察。 sn-p
type Foo<'a>(element : 'a) =
member this.Element = element
and Bar =
static member Create(element : 'a) = new Foo<'a>(element)
编译。所以这个问题似乎与基于Foo<'a> 类的Copy() 方法进行的类型推断有关。此外,sn-p
type Foo<'a>(element : 'a) =
member this.Copy () = Bar.Create(element)
and Bar =
static member Create<'a>(element) = new Foo<'a>(element)
是代码的更类似于 C# 的版本(其中静态方法显式设为通用),它也无法编译,并出现错误“此代码不够通用。类型变量 'a 无法泛化因为它会逃脱它的范围。”
【问题讨论】:
标签: generics types f# static-methods type-inference