2017-02-15 8 views
4

私は、次のネストされたSeq.map()がコンパイルされ、効果的に働く機能で呼び出しを持っている:次のlint警告を促しF#Lintの警告を避けるためにどのようにリファクタリングするのですか?

|> 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) 
) 

リント:Seq.map f (Seq.map g x)を可能することができるかもしれませんSeq.map (g >>f) xにリファクタリングされました。

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

が、私は私の第二のパラメータが順序であるので、それらをリファクタリングする方法がわからないと、私は「それを変換したい:

私は警告がこれらのトップ2のマップの呼び出しによって促されると考えています"それを平らにしないでください。

これを行う方法を提案できますか?私はまた、そのコード断片だけのリント警告をオフにする方法を探しましたが、動力工具はそれを行う方法を提供していないようです。ここで

は完全酒のために全体の機能です:あなたの第二のトップレベルSeq.map

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

警告はネストされたマップ呼び出しではなく、一連のマップ呼び出しです。あなたのコードでどこが起こっているのか、おそらくmap-groupBy-mapを実行している場所で起こっているかもしれません。 – scrwtp

+3

トピックからやや離れていますが、そのような多くの型の注釈を記述する具体的な理由はありますか?私はそれらの90%を取り除き、もっと読みやすいコードを得ることができると思います。 –

+0

@Anton中間の形状の速度を上げることで、関数のライフタイムメンテナンスが向上します。いくつかの中間的なマップ - > "ブレークポイント"またはprintfn関数を中断するが、あまりにも混乱する可能性があります。スタイルとして、私は注釈もドキュメントの形式と同じようにタイプするよう指導されました。私はこれが誰にとっても人気のある選択ではないかもしれないと理解しています。 – Mario

答えて

5

、あなただけの通過tradedOnKeyを渡し、そしてあなたの順序で何かをしています。

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) 
) 

を(私はフルREPROのためのすべてのタイプの定義を持っていないので、検証が難しい)これは警告を取り除く必要があります:あなたが行うことによって、一つにすべてのことをマージすることができます。

+0

それだけです! sumByの最適化に感謝します。同じ行に誤字があります:pdrではなくpfrです。 – Mario

関連する問題