如何为参数集定义正确的数据结构

Mat*_*yel 5 f#

我需要以下数据结构:

在具有存储器插槽的设备中,每个插槽具有一组参数.这些参数有不同的类型.可能的参数列表是固定的,因此不需要通用的灵活性»支持任意参数而无需改变«.而且,对于每个参数,内容的结构是已知的.典型的用例是检索和修改一个特定参数,以及将完整参数集转换为不同(但已定义)的数据结构.

F#数据结构的自然选择是这样的和类型:

type SomeParameterContentType = { Field1 : string, Field2 : int }
type SomeOtherParameterContentType = { Other1 : bool option, Other2 : double }

type Parameter =
    | SomeParameter of SomeParameterContentType
    | SomeOtherParameter of SomeOtherParameterContentType
Run Code Online (Sandbox Code Playgroud)

这样我就可以用一个非常好的数据结构创建一个集合并存储参数.这里的问题是:鉴于这个想法,如何寻找一个特定的参数?我不知道为set的find-function指定谓词的任何方法.有可能定义另一个和类型列出参数类型而没有它们的内容,使用它作为词典的键,但我不太喜欢这个想法.使用字符串而不是第二个和类型并不能使事情变得更好,因为它仍然需要提供两次可能的参数列表.

有没有人有更好的主意?

Thx --Mathias.

Kev*_*vin 0

听起来你想要的只是 tryFind 一个集合:

module Set =

  let tryFind p =
    Set.toList >> List.tryFind p
Run Code Online (Sandbox Code Playgroud)

用法:

let mySet = Set.ofList [1;2;3;4;5]
let m = mySet |> Set.tryFind (fun t -> t = 2)
Run Code Online (Sandbox Code Playgroud)

val m : int 选项 = Some 2

与您的类型一起使用:

let yourSet = Set.ofList [SomeParameter {Field1="hello";Field2=3}]
let mYours = yourSet |> Set.tryFind (fun t -> match t with
                                              |SomeParameter p -> true
                                              |SomeOtherParameter p -> false)
Run Code Online (Sandbox Code Playgroud)

val mYours : 参数选项 = Some (SomeParameter {Field1 = "hello"; Field2 = 3;})