Код F # недостаточно универсален (используется ограничение статического члена) - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь создать универсальную функцию, которая проверяет, находится ли запись в допустимом формате, учитывая, что запись реализует статический член, допустимый. При попытке использовать это в ElmishComponent в рамках Bolero (Blazor), я получаю следующую ошибку

Этот код недостаточно универсален. Переменная типа ^ childModel, когда ^ childModel: (действительный статический член: ^ childModel -> bool) не может быть обобщена, поскольку она выходит за пределы своей области действия

Со следующим кодом

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

1 Ответ

0 голосов
/ 17 января 2019

Возможно, я что-то упускаю, но мне кажется, что более простой подход заключается в использовании интерфейса, который реализует дочерняя модель, - тогда вам вообще не нужно беспокоиться о статических ограничениях членов:

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            
        ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...