F# 代码不够通用(使用静态成员约束)
F# Code is not sufficiently generic (using a static member constraint)
我正在尝试创建一个通用函数来检查记录是否采用有效格式,前提是记录实现了静态成员有效。尝试在 Bolero (Blazor) 框架内的 ElmishComponent 中使用它时,出现以下错误
This code is not sufficiently generic. The type variable ^childModel when ^childModel : (static member valid : ^childModel -> bool) could not be generalized because it would escape its scope
用下面的代码
module Modal =
type Message<'childModel, 'childMessage> = | Confirm of 'childModel | Cancel | ChildMessage of 'childMessage
type Model<'T> = { Display : bool; Title : string; Child : 'T }
let inline valid (x: ^t) =
(^t: (static member valid: ^t -> bool) (x))
type Component<'T, ^childModel, 'childMessage when 'T :> ElmishComponent< ^childModel, 'childMessage> and ^childModel : (static member valid: ^childModel -> bool)>() =
inherit ElmishComponent<Model<'childModel>, Message<'childModel, 'childMessage>>()
// Error is highlighted on this line
override this.View model dispatch =
cond model.Display <| function
| true ->
div [ attr.style (if model.Display then "background: lightblue;" else "background: grey;") ] [
h3 [] [ text model.Title ]
ecomp<'T,_,_> model.Child (dispatch << ChildMessage)
p [] []
button [
// This is where I use the valid function
attr.disabled (if valid model.Child then null else "true")
on.click (fun _ -> dispatch <| Confirm model.Child)
] [ text "Confirm" ]
button [ on.click (fun _ -> dispatch Cancel) ] [ text "Cancel" ]
]
| false ->
empty
我可能遗漏了一些东西,但在我看来,更简单的方法是使用子模型实现的接口——这样您就根本不必为静态成员约束而烦恼:
type IValidable =
abstract IsValid : bool
type Component<'T, 'childModel, 'childMessage when
'T :> ElmishComponent< 'childModel, 'childMessage> and
'childModel :> IValidable>() =
inherit ElmishComponent<Model<'childModel>, Message<'childModel, 'childMessage>>()
override this.View model dispatch =
let test = model.Child.IsValid
()
我正在尝试创建一个通用函数来检查记录是否采用有效格式,前提是记录实现了静态成员有效。尝试在 Bolero (Blazor) 框架内的 ElmishComponent 中使用它时,出现以下错误
This code is not sufficiently generic. The type variable ^childModel when ^childModel : (static member valid : ^childModel -> bool) could not be generalized because it would escape its scope
用下面的代码
module Modal =
type Message<'childModel, 'childMessage> = | Confirm of 'childModel | Cancel | ChildMessage of 'childMessage
type Model<'T> = { Display : bool; Title : string; Child : 'T }
let inline valid (x: ^t) =
(^t: (static member valid: ^t -> bool) (x))
type Component<'T, ^childModel, 'childMessage when 'T :> ElmishComponent< ^childModel, 'childMessage> and ^childModel : (static member valid: ^childModel -> bool)>() =
inherit ElmishComponent<Model<'childModel>, Message<'childModel, 'childMessage>>()
// Error is highlighted on this line
override this.View model dispatch =
cond model.Display <| function
| true ->
div [ attr.style (if model.Display then "background: lightblue;" else "background: grey;") ] [
h3 [] [ text model.Title ]
ecomp<'T,_,_> model.Child (dispatch << ChildMessage)
p [] []
button [
// This is where I use the valid function
attr.disabled (if valid model.Child then null else "true")
on.click (fun _ -> dispatch <| Confirm model.Child)
] [ text "Confirm" ]
button [ on.click (fun _ -> dispatch Cancel) ] [ text "Cancel" ]
]
| false ->
empty
我可能遗漏了一些东西,但在我看来,更简单的方法是使用子模型实现的接口——这样您就根本不必为静态成员约束而烦恼:
type IValidable =
abstract IsValid : bool
type Component<'T, 'childModel, 'childMessage when
'T :> ElmishComponent< 'childModel, 'childMessage> and
'childModel :> IValidable>() =
inherit ElmishComponent<Model<'childModel>, Message<'childModel, 'childMessage>>()
override this.View model dispatch =
let test = model.Child.IsValid
()