2015-03-27 16 views
5

trzeba strukturę danych za:Jak określić odpowiednią strukturę danych dla zestawu parametrów

w urządzeniu, które ma szczeliny pamięci każda ze szczelin ma zestaw parametrów. Te parametry mają różne typy. Lista możliwych parametrów jest stała, więc nie ma potrzeby ogólnej elastyczności à la »Wsparcie dowolnych parametrów bez zmian«. Ponadto dla każdego parametru znana jest struktura zawartości. Typowe przypadki użycia to pobieranie i modyfikacja jednego określonego parametru, a także przekształcenie kompletnego zestawu parametrów w inną (ale już zdefiniowaną) strukturę danych.

Naturalny wybór F # struktury danych byłby typ suma tak:

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

type Parameter = 
    | SomeParameter of SomeParameterContentType 
    | SomeOtherParameter of SomeOtherParameterContentType 

W ten sposób można utworzyć zbiór i przechowywanie parametrów tam z bardzo ładnym struktury danych. Pytanie brzmi: biorąc pod uwagę ten pomysł, jak wyglądałby wygląd konkretnego parametru? Nie wiem, w jaki sposób określić predykat dla funkcji find dla zestawów. Byłoby możliwe zdefiniowanie innego rodzaju sum wyszczególniających tylko Typy Parametrów bez ich zawartości, używając tego jako klucza dla Słownika, ale nie podoba mi się ten pomysł za bardzo. Używanie łańcuchów zamiast drugiego typu sumy nie poprawia sytuacji, ponieważ nadal wymagałoby dwukrotnego podania listy możliwych parametrów.

Czy ktoś ma lepszy pomysł?

Thx - Mathias.

+0

Myślę, że pomysł jest właściwy - ale nie dostaję tego, czego szukasz. Prawdopodobnie będziesz mieć "Listę " do pracy i możesz po prostu użyć ['List.tryFind'] (https://msdn.microsoft.com/de-de/library/ee353506.aspx) z czymś podobnym do' function (SomeParameter {Field1 = "find"; Field2 = _}) -> true | _ -> false'? – Carsten

+0

@Carsten König: Parametry będą przechowywane na liście (lub ustawione, jeśli o to chodzi) i chciałbym pobrać jeden z parametrów z listy i odczytać jego wartości (więc ich nie znam). Tak więc coś w stylu 'tryFind (function (SomeParameter _) -> true | _ -> false)' może być rozwiązaniem. W efekcie otrzymam listę funkcji predykatu 'let someParameterPredicate = function (SomeParameter _) -> true | _ -> false', a następnie użyj 'tryFind someParameterPredicate'. Trochę kłopotliwe, ale wykonalne i bezpieczne. Ciekawy! –

+0

jeśli chcesz odebrać część, której możesz użyć ['List.tryPick'] (https://msdn.microsoft.com/de-de/library/ee353814.aspx) (lub' List.pick') - ale tak, będziesz potrzebować tych funkcji.Jeśli tak jest, zawsze możesz przejść do trasy OOP i użyć interfejsów lub słowników – Carsten

Odpowiedz

0

Brzmi jak tylko chcesz to tryFind za zestaw:

module Set = 

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

Zastosowanie:

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

val m: int option = Część 2

użycia z Twoje typy:

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: Parametr option = Some (SomeParameter {Field1 = "hello"; Pole 2 = 3;})

Powiązane problemy