我需要以下数据结构:
在具有内存插槽的设备中,每个插槽都有一组参数。这些参数有不同的类型。可能的参数列表是固定的,因此不需要通用的灵活性 à la »支持任意参数而无需更改«。此外,对于每个参数,内容的结构是已知的。典型的用例是检索和修改一个特定参数,以及将完整参数集转换为不同(但已定义)的数据结构。
F# 数据结构的自然选择将是这样的 sum 类型:
type SomeParameterContentType = { Field1 : string, Field2 : int }
type SomeOtherParameterContentType = { Other1 : bool option, Other2 : double }
type Parameter =
| SomeParameter of SomeParameterContentType
| SomeOtherParameter of SomeOtherParameterContentType
通过这种方式,我可以创建一个集合并使用非常好的数据结构将参数存储在那里。这里的问题是:鉴于这个想法,如何寻找特定参数?我不知道有什么方法可以为集合的查找函数指定谓词。使用它作为字典的键可以定义另一个仅列出参数类型而没有其内容的总和类型,但我不太喜欢这个想法。使用字符串而不是第二个 sum 类型并没有让事情变得更好,因为它仍然需要两次提供可能的参数列表。
有没有人有更好的主意?
谢谢
——马蒂亚斯。
最佳答案
听起来你想要的只是一个 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 : Parameter option = Some (SomeParameter {Field1 = "hello"; Field2 = 3;})
关于f# - 如何为参数集定义合适的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296731/