【发布时间】:2010-08-30 18:42:45
【问题描述】:
给定具有多个字段的类型(候选人),可以得分(这里是一个带有 _scoreXXX 的具体示例)并计算总百分比分数:
type ScorableCandidate() =
let mutable _scoreXXX: int = 0 ;
let mutable _percentXXX: float = 0. ;
member this.scoreXXX
with get() = _scoreXXX
and set(v) =
_scoreXXX<- v
propertyChanged.Trigger(this, new PropertyChangedEventArgs("scoreXXX"))
member this.percentXXX
with get() = _percentXXX
and set(v) =
_percentXXX <- v
propertyChanged.Trigger(this, new PropertyChangedEventArgs("percentXXX"))
我想抽象百分比的计算,所以我不需要每次都重新定义函数。不幸的是,我不知道如何使用成员函数来做到这一点。我正在抽象的代码的模板是:
let scoreXXXs () =
let totalXXXScore = List.fold (fun acc (candidate: ScorableCandidate) -> acc + candidate.scoreXXXs) 0 brokers
let score (candidate: ScorableCandidate) =
candidate.percentXXXs <- (float candidate.scoreXXXs) / float totalXXXScore * 100.
if totalXXXScore > 0 then
List.iter score <| brokers
我想我希望能够将函数定义为“分数”并传入适当的成员访问器。这样我就可以写了
score XXX // where xxx is some property in the class that needs to be scored
score YYY // where yyy is some property in the class that needs to be scored
一个想法是传递函数来获取访问权限,这对于 getter 来说很容易,但我似乎无法弄清楚 setter。我意识到我可以对此进行反思 - 但我觉得这可能不是最好的 (f#) 方式......此时我处于:
let scoreField (accessF : (ScorableCandidate -> int)) (setF : (float -> unit)) =
let totalScore = List.fold (fun acc (candidate: ScorableCandidate) -> acc + accessF candidate) 0 brokers
let score (candidate: ScorableCandidate) =
setF <| (accessF candidate |> float) / float totalScore * 100.
if totalScore > 0 then
List.iter score <| brokers
scoreField (fun c -> c.scoreXXX) (fun f -> ())
但我不知道如何(或是否有可能)将 setter 表示为类型上的 lambda 函数(也许我可以将实例作为参数传递给 lambda 函数并以某种方式调用它)。
想法?先谢谢了。
更新发现这种方法(想法): http://laurent.le-brun.eu/site/index.php/2009/10/17/52-dynamic-lookup-operator-aka-duck-typing-in-fsharp
【问题讨论】:
标签: f#