试图理解推断的类型约束

时间:2015-12-22 05:02:18

标签: f# type-inference type-constraints

以下产量

  

此构造导致代码不像类型注释所指示的那样通用。类型变量' P已被约束为类型' bool'。

表示let myValue =表达式的右侧,

  

此代码的通用性低于其注释所要求的,因为显式类型变量' P'无法概括。它被限制为“bool'

。”

表示<'P>方法中的通用Value

type MyTypeA<'T> (myObject : 'T) as this =
    let myValue = this.Value<bool> "SomeBooleanProperty"

    member this.Value<'P> name = typeof<'T>.GetProperty(name, typeof<'P>).GetValue(myObject, null) :?> 'P`

但是,这样编译得很好,不会产生任何警告或错误:

type MyTypeB<'T> (myObject : 'T) as this =
    member this.Value<'P> name = typeof<'T>.GetProperty(name, typeof<'P>).GetValue(myObject, null) :?> 'P

    member this.Method<'P> name = this.Value<'P> name

这是怎么回事?在第一个例子中,为什么在私有值的赋值中识别的方法,而不是合法的通用方法?

1 个答案:

答案 0 :(得分:2)

来自 ConstraintSolver.fs SolveTyparEqualsTyp 中的 CheckWarnIfRigid 函数引发警告(FS0064)。 引发警告后, SolveTyparEqualsTyp 将继续(因为到目前为止没有错误)来解决类型约束。 SolveTyparEqualsTyp 的评论是:

/// Add the constraint "ty1 = ty" to the constraint problem, where ty1 is a type variable. 
/// Propagate all effects of adding this constraint, e.g. to solve other variables 

在OP的示例中,这会导致成员Value定义的错误FS0663。其次是错误FS0660。 出于某种原因,我忽略了一些传播。

也许类型推断过于激进。 @jpe和OP的问题下面的其他评论包含更多有趣的线索。