2017-02-15 2 views
4

Ich habe folgende verschachtelte Seq.map() in einer Funktion aufruft, und arbeitet kompiliert effektiv:Wie umgestalten, um F # Lints Warnung zu vermeiden?

|> Seq.map (fun (tradedOnKey : DateTime, portfolioSeq : seq<PortfolioId * seq<PortfolioFundRecord>>) -> 
     let pricedPortfoliosGroup = 
      portfolioSeq 
      |> Seq.map (fun (p : PortfolioId, spsf : (seq<PortfolioFundRecord>)) -> 
       let price = 
        spsf 
        |> Seq.map (fun (pfr : PortfolioFundRecord) -> pfr.Fund.ClosingPrice * float pfr.PortfolioWeight/100.0) 
        |> Seq.reduce (+) 
       let topPortfolioFundRecord = spsf |> Seq.head 
       { PortfolioId = p; Price = price; TradedOn = topPortfolioFundRecord.Fund.TradedOn } 
      ) 
     (tradedOnKey, pricedPortfoliosGroup) 
) 

, die folgenden Flusen Warnung aufgefordert:

Lint: Seq.map f (Seq.map g x) könnte in der Lage sein, zu sein in Seq.map (g >>f) x refaktoriert.

Ich glaube, die Warnung von diesen Top-2 Karte Anrufe aufgefordert wird:

|> Seq.map (fun (tradedOnKey : DateTime, portfolioSeq : seq<PortfolioId * seq<PortfolioFundRecord>>) -> 
     let pricedPortfoliosGroup = 
      portfolioSeq 
      |> Seq.map (fun (p : PortfolioId, spsf : (seq<PortfolioFundRecord>)) -> 

aber ich weiß nicht, wie sie Refactoring seit meinem zweiten Parameter eine Sequenz ist, und ich will „es verwandeln "Aber nicht abflachen.

Können Sie einen Weg vorschlagen, dies zu tun? Ich suchte auch nach einer Möglichkeit, die Flusenwarnung nur für dieses Codefragment auszuschalten, aber die Elektrowerkzeuge scheinen keine Möglichkeit dafür zu bieten.

Hier ist die ganze Funktion für Vollständigkeit halber:

let getPortfoliosPrices(dbFundsWithPortfolioFunds : (DbFunds * DbPortfolioFunds) Linq.IQueryable)(takenDays: int) = 

let portfolioPrices = 
    dbFundsWithPortfolioFunds 
    |> Seq.collect(fun (f : DbFunds, fp : DbPortfolioFunds) -> 
     takenDays |> getStockPrices f.Symbol 
     |> Seq.map(fun(quote : FundQuote) -> 
      let portfolioFundRec = {PortfolioId = fp.PortfolioId; PortfolioWeight = fp.Weight; Fund = quote} 
      portfolioFundRec) 
     ) 
     |> Seq.groupBy(fun (portfolioFundRec : PortfolioFundRecord) -> portfolioFundRec.Fund.TradedOn) 
     |> Seq.map(fun (tradedOnKey : DateTime, spfr : PortfolioFundRecord seq) -> 
     let gpfr = spfr |> Seq.groupBy (fun(pfr : PortfolioFundRecord)->pfr.PortfolioId) 
     (tradedOnKey, gpfr) 
    ) 
    |> Seq.map (fun (tradedOnKey : DateTime, portfolioSeq : seq<PortfolioId * seq<PortfolioFundRecord>>) -> 
      let pricedPortfoliosGroup = 
       portfolioSeq 
       |> Seq.map (fun (p : PortfolioId, spsf : (seq<PortfolioFundRecord>)) -> 
        let price = 
         spsf 
         |> Seq.map (fun (pfr : PortfolioFundRecord) -> pfr.Fund.ClosingPrice * float pfr.PortfolioWeight/100.0) 
         |> Seq.reduce (+) 
        let topPortfolioFundRecord = spsf |> Seq.head 
        { PortfolioId = p; Price = price; TradedOn = topPortfolioFundRecord.Fund.TradedOn } 
       ) 
      (tradedOnKey, pricedPortfoliosGroup) 
    ) 
portfolioPrices 
+0

Die Warnung bezieht sich nicht auf verschachtelte Kartenaufrufe, sondern auf eine Abfolge von Kartenaufrufen. Keine Ahnung, wo das in deinem Code passiert, vielleicht an der Stelle, an der du mappst - groupBy - map, in diesem Fall ist es wahrscheinlich nur ein schlechter Ratschlag. – scrwtp

+3

Etwas außerhalb des Themas, aber gibt es einen bestimmten Grund, warum Sie so viele Typ Anmerkungen schreiben? Ich würde erwarten, dass Sie 90% von ihnen entfernen können und viel mehr lesbaren Code bekommen. –

+0

@Anton Um schneller mit der Form der Zwischenergebnisse über die Lebensdauer der Funktion zu arbeiten. Einige Befürworter intervenieren intermediate map-> "breakpoint" oder printfn-Funktionen, aber das kann auch durcheinander. Als Stil war ich auch Mentor, Anmerkungen genauso zu tippen wie eine Art Dokumentation. Ich verstehe, dass dies keine beliebte Wahl für alle ist. – Mario

Antwort

5

In Ihrem zweiten Top-Level-Seq.map, Sie nur auf tradedOnKey durch, und mit Ihrer Sequenz etwas tun. Man könnte das alles in einem einzigen, verschmelzen, indem Sie:

dbFundsWithPortfolioFunds 
|> Seq.collect(fun (f : DbFunds, fp : DbPortfolioFunds) -> 
    takenDays |> getStockPrices f.Symbol 
    |> Seq.map(fun(quote : FundQuote) -> 
     let portfolioFundRec = {PortfolioId = fp.PortfolioId; PortfolioWeight = fp.Weight; Fund = quote} 
     portfolioFundRec) 
    ) 
    |> Seq.groupBy(fun portfolioFundRec-> portfolioFundRec.Fund.TradedOn) 
    |> Seq.map(fun (tradedOnKey, spfr) -> 
     let gpfr = spfr |> Seq.groupBy (fun pfr -> pfr.PortfolioId) 
     let pricedPortfoliosGroup = 
      gpfr 
      |> Seq.map (fun (p, spsf) -> 
       let price = 
        spsf 
        |> Seq.sumBy (fun pfr -> pfr.Fund.ClosingPrice * float pfr.PortfolioWeight/100.0) 
       let topPortfolioFundRecord = spsf |> Seq.head 
       { PortfolioId = p; Price = price; TradedOn = topPortfolioFundRecord.Fund.TradedOn } 
      ) 
     (tradedOnKey, pricedPortfoliosGroup) 
) 

Diese von der Warnung loswerden sollte (schwer zu überprüfen, weil ich nicht alle für eine vollständige Repro die Typdefinitionen haben).

+0

Das ist es! Und danke für die sumBy Optimierung. Es gibt einen Tippfehler in derselben Zeile: pfr statt pdr. – Mario

Verwandte Themen