Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics F#类型推断没有类型注释所指示的那么一般_Generics_F#_Type Inference - Fatal编程技术网

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的每个实例都有两个类型参数,而不是一个类型参数,这不是我所寻找的增加复杂性的可选参数,该参数不存储为实例字段。有没有一种方法可以给构造函数一个类本身没有的类型参数,或者我必须使用静态函数或其他东西来代替它?@Flaise
SomeClass
通常应该有两个类型参数,如果它的构造函数有它们的话。想象一个像
Array.zeroCreateSo这样的表达式,我不能参数化/只是/构造函数-构造函数采用与整个类相同的类型参数?我将只使用静态函数,因为.NET在运行时保存该类型信息,这会干扰调试和性能。这确实消除了警告,但它的副作用是使SomeClass的每个实例都有两个类型参数,而不是一个不是我所寻找的添加复杂性的类型参数,该类型参数不是存储为实例字段的可选参数。有没有一种方法可以给构造函数一个类本身没有的类型参数,或者我必须使用静态函数或其他东西来代替它?@Flaise
SomeClass
通常应该有两个类型参数,如果它的构造函数有它们的话。想象一个像
Array.zeroCreateSo这样的表达式,我不能参数化/只是/构造函数-构造函数采用与整个类相同的类型参数?我将只使用静态函数,因为.NET在运行时保存该类型信息,这会干扰调试和性能。
    SomeClass(func, this)