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

时间:2015-03-27 09:00:32

标签: f#

我需要以下数据结构:

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

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

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

type Parameter =
    | SomeParameter of SomeParameterContentType
    | SomeOtherParameter of SomeOtherParameterContentType

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

有没有人有更好的主意?

THX --Mathias。

1 个答案:

答案 0 :(得分:0)

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

module Set =

  let tryFind p =
    Set.toList >> List.tryFind p

用法:

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

val m:int option = 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)
  

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