Я хотел бы определить тип, такой как:
type blah =
AThing
| AnotherThing
with
static member ofString : string -> blah
override x.ToString () : string
Я хотел бы убедиться, что эти два метода всегда гарантированно согласованы.Хороший способ сделать это - создать две карты из одного и того же списка пар, а затем превратить их в очевидные реализации двух методов.Примерно:
let pairs = [Athing, "AThing"; AnotherThing, "AnotherThing"]
let tostr = Map.ofList pairs
let toblah = pairs |> List.map swap |> Map.ofList
Я думаю, этот код может быть определен только в статической функции-члене.Статический бит подразумевается тем, что он должен быть доступен из ofString, который является статическим.Он не может быть определен перед типом, так как список зависит от него.Это не может быть определено позже, потому что F # не позволяет методам быть просто объявленными и реализованными позже (так же, как, например, C ++).Так что остается выбор между статическим членом и статическим let.Компилятор говорит, что статические let не допускаются в дополнении.(?)
Код отлично работает, когда помещается в статическую функцию-член, однако он создает карты каждый раз, когда они необходимы.Излишне говорить, что это даже менее эффективно, чем линейный поиск.Как мне сделать это правильно, пожалуйста?Большое спасибо.