Etant donné un type (candidat) qui a des champs muiltiple on peut marquer (ici un exemple concret avec _scoreXXX) et calculer le pourcentage total score:F # comment passer une variable de fonction à une fonction de membre
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"))
I Je voudrais abscter le calcul des pourcentages, donc je n'ai pas besoin de redéfinir la fonction à chaque fois. Malheureusement, je suis perdu sur la façon de le faire avec les fonctions membres. Le modèle du code que je regarde est abstraction:
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
Je suppose que je voudrais être en mesure de définir la fonction comme « score » et de passer dans les accesseurs membres de aapropriate. Un tel que je pourrais écrire
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
Une pensée que j'avais passait des fonctions pour obtenir l'accès, et qui est assez facile à faire pour le getter, mais je ne peux pas sembler figurer le compositeur. Je me rends compte que je pouvais reporter à la réflexion pour cela - mais je pense que peut-être pas le meilleur (f #) façon ... À ce moment, je suis à:
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 ->())
Mais je ne sais pas comment (ou si il est possible de représenter le setter comme une fonction lambda sur le type (où peut-être je peux passer l'instace en tant que paraneter à la fonction lambda et l'invoquer en quelque sorte).
Pensées? Merci d'avance.
Mise à jour Trouvé cette approche (pensées): http://laurent.le-brun.eu/site/index.php/2009/10/17/52-dynamic-lookup-operator-aka-duck-typing-in-fsharp
choisir cette solution - parce que je ne fais que développer un prototype, et cela a fonctionné. Je pense que ce sont toutes des approches valables, et comme Tomas l'a mentionné une nouvelle conception de la couche d'objet pourrait être un meilleur plan, mais je suis contraint par une couche RPC existante qui empêche cela de mon côté. Merci a tous – akaphenom