类型 'XmlProvider<...>.Parameter' 不支持运算符 'get_Value'?
The type 'XmlProvider<...>.Parameter' does not support the operator 'get_Value'?
如何修复代码? inline/Statically Resolved Type 和结构类型一样强大吗?
The type 'XmlProvider<...>.Parameter' does not support the operator 'get_Value'?
let input1 = """<r1><parameters><parameter name="token">1</parameter><parameter name="other">xxx</parameter></parameters><othersOf1>..sample....</othersOf1></r1>"""
let xml1 = XmlProvider<"""<r1><parameters><parameter name="token">1</parameter><parameter name="other">xxx</parameter></parameters><othersOf1>...</othersOf1></r1>""">.Parse(input1)
let inline get name parameters =
parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
|> Option.map (fun v -> (^P : (member Value : 'b) v))
get "token" xml1.Parameters
Value
仅针对具有单一类型(或类型提供程序可以统一的类型,例如 2 和 3.0)的节点定义。在您的示例中,第二个值是字符串 xxx
,因此参数获得 两个 属性:Number
和 String
,每个返回一个 option
各自的类型。您可以
更改您的输入以具有 一个单一 一致的值类型 (xxx
→ 2
)
let xml1 = XmlProvider<"""<r1><parameters><parameter name="token">1</parameter><parameter name="other">2</parameter></parameters><othersOf1>...</othersOf1></r1>""">.Parse(input1)
将它们变成单一输出类型(例如string
)
let inline get name parameters =
parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
|> Option.bind (fun v ->
match (^P : (member Number : int option) v) with
| Some number -> Some (string number)
| None -> (^P : (member String : string option) v))
创建合适的 DU
type Value = Number of int | Name of string
let inline get name parameters =
parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
|> Option.map (fun v ->
match (^P : (member Number : int option) v) with
| Some number -> Number number
| None ->
match (^P : (member String : string option) v) with
| Some s -> Name s
| _ -> failwith "Either number or string should be Some(value)")
如果您事先不知道这些值,您还可以告诉类型提供程序不要推断它们:
XmlProvider<"""...""", InferTypesFromValues=false>
这将导致 parameters
有一个 Value : string
属性。
如何修复代码? inline/Statically Resolved Type 和结构类型一样强大吗?
The type 'XmlProvider<...>.Parameter' does not support the operator 'get_Value'?
let input1 = """<r1><parameters><parameter name="token">1</parameter><parameter name="other">xxx</parameter></parameters><othersOf1>..sample....</othersOf1></r1>"""
let xml1 = XmlProvider<"""<r1><parameters><parameter name="token">1</parameter><parameter name="other">xxx</parameter></parameters><othersOf1>...</othersOf1></r1>""">.Parse(input1)
let inline get name parameters =
parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
|> Option.map (fun v -> (^P : (member Value : 'b) v))
get "token" xml1.Parameters
Value
仅针对具有单一类型(或类型提供程序可以统一的类型,例如 2 和 3.0)的节点定义。在您的示例中,第二个值是字符串 xxx
,因此参数获得 两个 属性:Number
和 String
,每个返回一个 option
各自的类型。您可以
更改您的输入以具有 一个单一 一致的值类型 (
xxx
→2
)let xml1 = XmlProvider<"""<r1><parameters><parameter name="token">1</parameter><parameter name="other">2</parameter></parameters><othersOf1>...</othersOf1></r1>""">.Parse(input1)
将它们变成单一输出类型(例如
string
)let inline get name parameters = parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name) |> Option.bind (fun v -> match (^P : (member Number : int option) v) with | Some number -> Some (string number) | None -> (^P : (member String : string option) v))
创建合适的 DU
type Value = Number of int | Name of string let inline get name parameters = parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name) |> Option.map (fun v -> match (^P : (member Number : int option) v) with | Some number -> Number number | None -> match (^P : (member String : string option) v) with | Some s -> Name s | _ -> failwith "Either number or string should be Some(value)")
如果您事先不知道这些值,您还可以告诉类型提供程序不要推断它们:
XmlProvider<"""...""", InferTypesFromValues=false>
这将导致
parameters
有一个Value : string
属性。