[<RequireQualifiedAccess>]
[<RequireQualifiedAccess>]
and IUData = abstract member UData: UData
member a.UData = UData.TDec a
member a.UData = UData.TDate a
member a.UData = UData.TBool a
let inline makeGetA< ^T, ^D when ^T : (member A: ^D)> ()=
fun (t: ^T) -> (^T : (member A: ^D) t)
let inline makeGetProp< ^T, ^D, ^P
type IA<'D> = abstract member A: 'D
type IGetP<'P,'D when 'P :> IUData> = abstract member GetP: 'P -> 'D
let inline IFromMember< ^T, ^D when ^T : (member A: ^D)>() =
let getter = makeGetA< ^T, ^D> ()
fun (e: ^E) -> { new IA< ^D> with member __.A= getter e}
let inline IIFromMember< ^T, ^D when ^T : (member A: ^D)>() =
let getter = makeGetA< ^T, ^D> ()
fun (e: ^E) -> { new IA< ^D> with member __.A= getter e}