Wiem, że F # ma MAP, ale chcę używać słownika .NET. Ten DICT mieć klucz jako ciąg i wartości jako # wartości F + dict, a mianowicie:Jak dokonać .NET Mutable Dictionary <T, T> z StructuralComparison & Equality w F #
type ExprC =
| StrC of string
| BoolC of bool
| IntC of int32
| DecC of decimal
| ArrayC of int * array<ExprC>
| RelC of RelationC
and RelationC = Dictionary<string, ExprC>
Teraz problem chcę rozwiązać ten sposób zapewnić typ RelationC równości strukturalnej. Jeśli jest wymagane, aby enkapsulować rzeczywistą pamięć masową, jak utworzyć kontener zastępujący Słownik, użyć go do operacji zmiennych i mieć równość strukturalną?
Przy obecnym odpowiedź, ten kod nie działa (przekleństwo realizacja nie jest kompletna, to jednak nawet nie skompilować):
[<CustomEquality; CustomComparison>]
type MyDict() =
inherit Dictionary<string, ExprC>()
override this.Equals x =
match x with
| :? MyDict as y -> (this = y)
| _ -> false
override this.GetHashCode() =
hash this
interface System.IComparable with
member x.CompareTo yobj =
match yobj with
| :? MyDict as y -> compare x y
| _ -> invalidArg "MyDict" "cannot compare values of different types"
and [<StructuralEquality;StructuralComparison>] ExprC =
| IntC of int
| StrC of string
| MapC of MyDict
Jest to błąd:
Error FS0377: This type uses an invalid mix of the attributes 'NoEquality', 'ReferenceEquality', 'StructuralEquality', 'NoComparison' and 'StructuralComparison' (FS0377)
Z ciekawości, czy istnieje szczególny powód, dla którego chce się to zrobić za pomocą 'Dictionary' zamiast' Map'? – TheInnerLight
Wydajność. Dicty .NET są o wiele szybsze (https://stackoverflow.com/questions/3396196/f-fsharpmap-vs-dictionary-performance). W moim przypadku użycia, będę potrzebował dużo. Plus, ciekawość. Myślę, że warto wiedzieć, w jaki sposób obrócić dobrego obywatela w klasę .NET;) – mamcx
Czy profilowałeś i znalazłeś problem z wydajnością, czy też zgadłeś, że będzie problem w przyszłości? Jeśli nie wiesz na pewno, czy to jest problem, nie utrudniaj życia. Zrób to w oczywisty sposób i rozwiąż problem później, jeśli zajdzie taka potrzeba. – TheInnerLight