Generics F#类型推断没有类型注释所指示的那么一般
在下面代码段的最后一行中,我得到了两个警告:Generics F#类型推断没有类型注释所指示的那么一般,generics,f#,type-inference,Generics,F#,Type Inference,在下面代码段的最后一行中,我得到了两个警告:此构造导致代码不像类型注释所指示的那样通用。类型变量“c”已被约束为类型“a”。和此构造导致代码的泛型性低于类型批注所指示的泛型。类型变量“b”已被约束为类型“a*”a。 type SomeBaseClass<'a> () = class end type SomeClass<'a when 'a:equality> (getValue:unit->'a, ?arg2:SomeBaseClass<'b>
此构造导致代码不像类型注释所指示的那样通用。类型变量“c”已被约束为类型“a”。
和此构造导致代码的泛型性低于类型批注所指示的泛型。类型变量“b”已被约束为类型“a*”a。
type SomeBaseClass<'a> () =
class end
type SomeClass<'a when 'a:equality> (getValue:unit->'a, ?arg2:SomeBaseClass<'b>) =
inherit SomeBaseClass<'a*'a>()
member this.Value with get () = getValue ()
member this.Transform (transformation:'a->'c) =
let func ():'c = transformation this.Value
SomeClass<'c> (func, this) // warnings are attached to this line
键入SomeBaseClass'c)=
让func():'c=转换此.Value
类函数
我没有看到任何东西阻止转换
返回与传递的类型不同的类型。我也不明白为什么第二个警告甚至是一个警告,因为我显然已经打算将新实例的'b
类型参数设置为'a*'a
这里我做错了什么?泛型类型
SomeClass
在其构造函数中使用了一个泛型参数'b
,该参数在其定义中缺失。将类型定义更改为
type SomeClass<'a, 'b when 'a:equality> ...
删除错误,返回的类的类型为
SomeClass泛型类型SomeClass
正在其构造函数中使用其定义中缺少的泛型参数'b
。将类型定义更改为
type SomeClass<'a, 'b when 'a:equality> ...
移除错误,并且返回的类是类型someclasss,它确实清除了警告,但它的副作用是使SomeClass的每个实例都有两个类型参数,而不是一个类型参数,这不是我所寻找的增加复杂性的可选参数,该参数不存储为实例字段。有没有一种方法可以给构造函数一个类本身没有的类型参数,或者我必须使用静态函数或其他东西来代替它?@FlaiseSomeClass
通常应该有两个类型参数,如果它的构造函数有它们的话。想象一个像Array.zeroCreateSo这样的表达式,我不能参数化/只是/构造函数-构造函数采用与整个类相同的类型参数?我将只使用静态函数,因为.NET在运行时保存该类型信息,这会干扰调试和性能。这确实消除了警告,但它的副作用是使SomeClass的每个实例都有两个类型参数,而不是一个不是我所寻找的添加复杂性的类型参数,该类型参数不是存储为实例字段的可选参数。有没有一种方法可以给构造函数一个类本身没有的类型参数,或者我必须使用静态函数或其他东西来代替它?@FlaiseSomeClass
通常应该有两个类型参数,如果它的构造函数有它们的话。想象一个像Array.zeroCreateSo这样的表达式,我不能参数化/只是/构造函数-构造函数采用与整个类相同的类型参数?我将只使用静态函数,因为.NET在运行时保存该类型信息,这会干扰调试和性能。
SomeClass(func, this)