2015-11-25 12 views
9

das folgende Stück Code vor:F #: Reduce diese Funktion

scores |> Map.fold (fun state key value -> 
        state + (findCoefficient conversion.Coefficients key) * value) 
        0m 

findCoefficient eine Dezimalzahl zurückgibt, und scores ist ein Map<string, decimal>

Nun, wenn ich dieses Stück Code in Visual Studio schreiben, die F # Power tools geben Sie mir diese Flusen Vorschlag/Warnung:

Lint: Wenn keine veränderbaren Argumente teilweise ap in der Kette von Funktionsaufrufen, dann können die Funktionsaufrufe und Lambda durch Komposition ersetzt werden. z.B. fun -> x |> isValid |> not könnte ersetzt werden mit isValid >> not

Wie würde ich das in diesem Fall tun?

+0

Nicht sicher, ob die Warnung hier gilt – Sehnsucht

+0

Gibt es einen weiteren Kontext dieses Codes? Vielleicht geht es bei diesem Tipp um Scores |> Nutzung? –

Antwort

9

Dies ist eine schreckliche Beratung aus dem Linter, aber es folgt eine gültige Begründung.

I conversion.Coefficient in Ihrem ursprünglichen Snippet ersetzen, um es ein bisschen kürzer:

scores |> Map.fold (fun state key value -> 
    state + (findCoefficient coeff key) * value) 0m 

Wenn Sie einen binären Operator in F # wie a + b haben, kann dies als eine Funktion Anwendung neu geschrieben werden (+) a b - und wir so können sie den obigen Code umschreiben als:

scores |> Map.fold (fun state key value -> 
    (+) state ((*) (findCoefficient coeff key) value)) 0m 

Nun, das ist nur eine verschachtelte Funktionsanwendung ist und so können wir es mit |> umschreiben:

scores |> Map.fold (fun state key value -> 
    value |> (*) (findCoefficient coeff key) |> (+) state) 0m 

Und jetzt können Sie tun, was die Linter vermuten lässt, die es in eine Funktion Zusammensetzung zu drehen ist:

scores |> Map.fold (fun state key -> 
    (*) (findCoefficient coeff key) >> (+) state) 0m 

Das ist nicht etwas, würde ich jemals in der Praxis schreiben wollen, aber Sie kann sehen, wie die Regeln, denen der linter in anderen (sinnvollen) Fällen folgt, hier gelten. Aber ich würde empfehlen, ein Problem mit der F# PowerTools zu öffnen, was darauf hindeutet, dass der Linter keinen albernen Rat geben sollte, wenn die Funktion binäre Operatoren beinhaltet :-).

+0

Wäre es besser, es direkt an [FSHarpLint] (https://github.com/fsprojects/FSharpLint) zu melden? –

+0

Möglicherweise bin ich mir nicht sicher! Aber so oder so, es wird die Autoren erreichen. –