F# 我怎样才能摆脱这一点;不能一概而论;错误?

F# 我怎样才能摆脱这一点;不能一概而论;错误?,f#,F#,我有这个接口声明 type IModel<'value, 'search, 'target when 'target :> IModel<'value, 'search, 'target>> = abstract token: string with get abstract value: 'value with get abstract search: 'search with get abstract GetEmpty: unit

我有这个接口声明

type IModel<'value, 'search, 'target when 'target :> IModel<'value, 'search, 'target>> =
    abstract token: string with get
    abstract value: 'value with get
    abstract search: 'search with get
    abstract GetEmpty: unit -> 'target
    abstract ReInitWith:  #IModel<_, 'search, _> -> 'target

type IModelSimple<'value, 'search> =
    inherit IModel<'value, 'search, IModelSimple<'value, 'search>>
    abstract Update:  ?token:string * ?value: 'value * ?search: 'search -> IModelSimple<'value, 'search>
类型IModel IModel IModel simple
这个函数创建一个对象表达式

let rec mkModelSimple<'value, 'search> vctor sctor token value search =
    {
        new IModelSimple<'value, 'search> with
            member this.token = token
            member this.value = value
            member this.search = search
            member this.GetEmpty() = mkModelSimple vctor sctor token (vctor()) (sctor())
            member this.ReInitWith (m: #IModel<_, 'search, _>) = mkModelSimple vctor sctor m.token this.value m.search
            member this.Update(?t:Token, ?v: 'value, ?s: 'search) =
                mkModelSimple vctor sctor (defaultArg t this.token) (defaultArg v this.value) (defaultArg s this.search)
    }
让rec mkModelSimple vctor sctor标记值搜索=
{
新IModelSimple与
成员this.token=token
成员this.value=value
member this.search=搜索
成员this.GetEmpty()=mkModelSimple vctor-sctor令牌(vctor())(sctor())
成员this.ReInitWith(m:#IModel IModel>=
抽象标记:带有get的字符串
抽象值:“带get的值”
抽象GetEmpty:unit->'目标
类型ISearchModel ISearchModel的目标
类型ISearchModelSimple=
继承ISearch模型
摘要更新:?标记:字符串*?值:'value*?搜索:'search->ISearchModelSimple
几乎与上面相同,只是提取了“搜索方面”

现在我在实现创建对象表达式的函数时

let rec mkSearchModelSimple<'value, 'search> vctor sctor token value search =
    {
        new ISearchModelSimple<'value, 'search> with
            member this.token = token
            member this.value = value
            member this.search = search
            member this.GetEmpty() = mkSearchModelSimple vctor sctor token (vctor()) (sctor())
            member this.ReInitWith (m: #ISearchModel<_, 'search, _>) = mkSearchModelSimple vctor sctor m.token this.value m.search
            member this.Update(?t:Token, ?v: 'value, ?s: 'search) =
                mkSearchModelSimple vctor sctor (defaultArg t this.token) (defaultArg v this.value) (defaultArg s this.search)
    }
让rec mkSearchModelSimple vctor sctor令牌值搜索=
{
新的ISearchModelSimplewith
成员this.token=token
成员this.value=value
member this.search=搜索
成员this.GetEmpty()=mkSearchModelSimple vctor-sctor令牌(vctor())(sctor())

成员this.ReInitWith(m:#ISearchModel第二个示例的一个问题是,这个
ISearchModel
方法具有所有未绑定的泛型类型参数:

abstract ReInitWith: ISearchModel<_, _, _> -> 'target
如果从第一个示例中删除该类型约束,它将无法以完全相同的方式编译

如果像在第一个示例中一样约束第二个泛型类型,则第二个示例将起作用:

type ISearchModel<'value, 'search, 'target when 'target :> ISearchModel<'value, 'search, 'target>> =
    inherit IModel<'value, 'target>
    abstract search: 'search with get
    abstract ReInitWith: ISearchModel<_, 'search, _> -> 'target

注意:我将您的
标记
类型引用替换为
字符串
;未提供其定义。

您能给出一个最小的可复制示例吗?@FyodorSoikin这里是另一个示例
abstract ReInitWith:  #IModel<_, 'search, _> -> 'target
type ISearchModel<'value, 'search, 'target when 'target :> ISearchModel<'value, 'search, 'target>> =
    inherit IModel<'value, 'target>
    abstract search: 'search with get
    abstract ReInitWith: ISearchModel<_, 'search, _> -> 'target
val mkSearchModelSimple :
  vctor:(unit -> 'value) ->
    sctor:(unit -> 'search) ->
      token:string ->
        value:'value -> search:'search -> ISearchModelSimple<'value,'search>