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>