【发布时间】:2012-03-28 06:59:24
【问题描述】:
我想定义一个类型,例如:
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。 (?)
将代码放入静态成员函数时可以正常工作,但是每次需要时都会生成映射。不用说,这甚至比线性搜索效率低。请问我该怎么做?非常感谢。
【问题讨论】:
标签: f#